XAML WPFでテキストボックスにフォーカスを設定する


91

このフォーラムや他のいくつかの投稿にもかかわらず、私はに焦点を合わせる方法を教えてくれる何かを見つけることができませんTextBox

多くのラベルとtextBoxを持つuserControlがあります。フォームが読み込まれると、特定のtextBoxにフォーカスが移動します。

tabIndexを設定しましたが、うまくいきませんでした。

助言がありますか?


回答:


177

FocusManager.FocusedElementこの目的で、添付プロパティを使用できます。以下は、デフォルトでフォーカスをTxtBに設定するコードです。

<StackPanel Orientation="Vertical" FocusManager.FocusedElement="{Binding ElementName=TxtB}">
    <TextBox x:Name="TxtA" Text="A" />
    <TextBox x:Name="TxtB" Text="B" />
</StackPanel>

TxtB.Focus()XAMLでこれを実行しない場合は、コードビハインドで使用することもできます。


13
@TarkaDaal:「私にとってはうまくいきませんでした」というコメントはもう少し複雑になる可能性があります。これはおそらく、フォーカスを盗む別のコントロールです。WPFでフォーカス戦争が始まると、物事はいたずらになる傾向があります!コントロール、および現在ビジュアルツリーのどこにいるかを確認してください(たとえば、ComboBoxテンプレート内では、これは効果がなく、このような他の多くのケースがあります)。スティーラーが見つからない場合は、ビヘイビアーまたはコードビハインドを使用して、ロード時にコントロールにフォーカスを設定します。
Julien Lebosquain 2013年

@JulienLebosquain:これはかなりシンプルなコントロールで、2つのボタンと、グリッド内のTextBox(ここに私が配置したFocusManagerもの)でした。最後に、コードビハインドでそれを行いました。
TarkaDaal 2013年

メンバー「FocusedElement」は認識されないか、アクセスできません。:( plus.google.com/photos/+HendyIrawan/albums/5990385944888867505/...
Hendy Irawan

@HendyIrawanそれはおそらくSilverlightプロジェクトですか?
MojoFilter 2014年

@MojoFilterそれはWindowsの携帯電話8 WPFのプロジェクトだ
Hendy Irawan

28

このプロパティはTextBoxに直接適用できます。

<TextBox Text="{Binding MyText}" FocusManager.FocusedElement="{Binding RelativeSource={RelativeSource Self}}"/>

16
うまくいきませんでした。コンテナにFocusManager.FocusedElement = "{Binding ElementName = TxtB}"を設定するとうまくいきました
Grant

1
チャームのように機能し、名前を付ける必要はありません。
Simon Mattes

1
私にとってもうまくいきませんでした。何かが足りませんか?
BrunoLM 2015

1
私もうまくいきませんでした。Julien Lebosquainによる提案。
Crypt32

1
私にとってもうまくいきません。提案されている他のすべての方法も機能しません。この問題は初歩的なものでなければならず、簡単に解決できるはずです。それが、多くのPPLがWPFを好まない理由です。
IgorStack 2017年

6

私はWPFを使用するのが初めてで、上記の例を読んでいます。同様の経験で、与えられたxamlコードの例を使用してテキストボックスにフォーカスを設定しようとしました。つまり、上記の例はすべて機能しませんでした。

私が見つけたのは、FocusManager.FocusElementをページ要素に配置する必要があることでした。親要素としてウィンドウを使用した場合、これもおそらく機能すると思います。とにかく、ここに私のために働いたコードがあります。

 <Page x:Class="NameOfYourClass"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
  xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
  mc:Ignorable="d"
  Title="Title" 
  Height="720"
  Width="915"
  Background="white"
  Loaded="pgLoaded"
  FocusManager.FocusedElement="{Binding ElementName=NameOfYourTextBox}">

  <!-- Create child elements here. -->

  </Page>

0

フォーカスしたい要素をバインドする

FocusManager.FocusedElement= "{Binding ElementName= Comobox1}"

グリッドまたはグループボックスなど


4
ええ、ええと、他の皆がしたのと同じ答えを与えてくれてありがとう... 4年後...
アダム・プロッチャー、2015年

4
@AdamPlocherいいですね。SulfianをStack Overflowから永久に削除しました。「Welcome to Stack overflow」メッセージがより適切でした。
Contango、2015

2
@Contango:「最後に見たNov 11 '14」。アダムが彼のコメントを投稿する前に彼はずっといなくなっていました :)
Gone Coding

0

FocusManagerはインテリセンスではなく、これは私を少し混乱させました。属性全体を入力しただけで機能しました。

FocusManager.FocusedElement = "{Binding ElementName = MyTextBox}"


Microsoft Visual Studio Enterprise 2015バージョン14.0.23107.0/C#/WPF


0

完全を期すために、コードビハインドからこれを処理する方法もあります(たとえば、何らかの理由で動的に作成され、XAMLに存在しないコントロールの場合)。ハンドラーをウィンドウのLoadedイベントにアタッチし、必要なコントロールの ".Focus()"メソッドを使用します。以下のベアボーンの例。

public class MyWindow
{
    private VisualCollection controls;
    private TextBox textBox;

    // constructor
    public MyWindow()
    {
        controls = new VisualCollection(this);
        textBox = new TextBox();
        controls.Add(textBox);

        Loaded += window_Loaded;
    }

    private void window_Loaded(object sender, RoutedEventArgs e)
    {
        textBox.Focus();
    }
}

0

実験から、xamlソリューション

FocusManager.FocusedElement="{Binding ElementName=yourElement}"

ウィンドウ階層の最上位の要素(通常はウィンドウ、またはその他すべてを配置するグリッド)に配置すると最適に機能するようです。


0

使用法: local:FocusManager.FocusOnLoad="True"

    public class FocusManager
    {
        public static readonly DependencyProperty FocusOnLoad = DependencyProperty.RegisterAttached(
            "FocusOnLoad",
            typeof(bool),
            typeof(FocusManager),
            new UIPropertyMetadata(false, new PropertyChangedCallback(OnValueChanged))
            );

        private static void OnValueChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
        {
            if (!(sender is Control control))
                return;

            if ((bool) e.NewValue == false)
                return;

            control.Loaded += (s, e) => control.Focus();
        }

        public static bool GetFocusOnLoad(DependencyObject d) => (bool) d.GetValue(FocusOnLoad);

        public static void SetFocusOnLoad(DependencyObject d, bool value) => d.SetValue(FocusOnLoad, value);
    }

0

DataTemplate内のグリッド内にTextBoxがあり、表示されたときにキーボードフォーカスを取得したい。私もそれを見つけました

<DataTemplate x:Key="DistanceView" DataType="{x:Type vm:ROI}">
    <Grid FocusManager.FocusedElement="{Binding ElementName=tbDistance}">
        <TextBox x:Name="tbDistance" Grid.Column="1" Grid.Row="1" VerticalAlignment="Bottom"/>
    </Grid>
</DataTemplate>

私にとってはうまくいきませんでした。

ただし、親のContentControlでFocus()を呼び出すと

private void ContentControl_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
{
    if ((sender as ContentControl).IsVisible)
    {
        (sender as ContentControl).Focus();
    }
}

動作を開始し、キャレットがTextBoxに表示されます。FocusManager.FocusedElementプロパティが効果を発揮するには、FocusScopeにフォーカスを与える必要があると思います。

ジェリー

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.