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


105

TextBoxWPFの要素にフォーカスを設定する方法

私はこのコードを持っています:

txtCompanyID.Focusable = true;
txtCompanyID.Focus();

...しかし、機能していません。

何か案が?


txtCompanyID.Focusable = true; Keyboard.Focus(txtCompanyID); 動作しますが、これは方法です。
MindRoasterMir

回答:


145

XAMLの場合:

<StackPanel FocusManager.FocusedElement="{Binding ElementName=Box}">
   <TextBox Name="Box" />
</StackPanel>

9
このアプローチは、MVVMと一致しているため、上記の他のアプローチよりも好みます。
トッド・スプラン14

1
フォーカスされた要素は読み取り専用ですxamlでどのように設定できますか?私はこれを使用しましたが、機能しませんでした<Style.Triggers> <Trigger Property = "Validation.HasError" Value = "True"> <Setter Property = "FocusManager.FocusedElement" Value = "{Binding Source = {RelativeSource Self}}" /> </ Trigger> </Style.Triggers>
WPFKK

@ user841612、次のリンクをチェックして、アセンブリと名前空間検証msdn.microsoft.com/en-us/library/...
usefulBee

これは一度だけ機能します。ページが作成された後にフォーカスを変更したい場合は、プログラムで変更する必要があります。
Joe Steele

これも機能します。txtCompanyID.Focusable = true; Keyboard.Focus(txtCompanyID);
MindRoasterMir

51

これまでのところ、問題のコードが機能しない理由は誰も説明していません。私の推測では、コードはWindowのコンストラクターに配置されていました。しかし、現時点では、フォーカスを設定するのは時期尚早です。ウィンドウが相互作用する準備ができたら、それを実行する必要があります。コードの最適な場所はLoadedイベントです。

public KonsoleWindow() {
  public TestWindow() {
    InitializeComponent();
    Loaded += TestWindow_Loaded;
  }

  private void TestWindow_Loaded(object sender, RoutedEventArgs e) {
    txtCompanyID.Focus();
  }
}

1
論理的に真実であり、あまりにも多くの苦労の後、この答えはかなり良い解決策として完璧です。
シヴァニ

これは私のために働いた。受け入れられた答えはしませんでした。ありがとう
BoundForGlory

バージョン固有かどうかは不明ですがFocus()、フォーカス状態パラメーターが必要です-例txtCompanyId.Focus(FocusState.Keyboard)
Dan


26
txtCompanyID.Focusable = true;
Keyboard.Focus(txtCompanyID);

msdn:

デスクトップ全体でキーボードフォーカスを持つ要素は1つだけです。WPFでは、キーボードフォーカスを持つ要素のIsKeyboardFocusedがtrueに設定されます。

設定行の後で中断して、IsKeyboardFocusedプロパティの値を確認できます。また、その行に本当に到達したかどうか、または他の要素を設定してその後にフォーカスを取得しているかどうかを確認してください。


19

これを試して : MyTextBox.Focus ( );


2
これは最もエレガントな答えであり、親を指定する必要もありません。これをありがとう、それは私にとって素晴らしい働きをします!
dbeachy1

ピーター・フーバーの答えはこれを行いますが、窓は私が働いていなかった理由である、最初にロードする必要があると説明している
アドリアンDavel

14

StackPanelではなくグリッドを使用していたため、これはどれもうまくいきませんでした。

私は最終的にこの例を見つけました:http : //spin.atomicobject.com/2013/03/06/xaml-wpf-textbox-focus/

これを次のように変更しました:

「リソース」セクション:

    <Style x:Key="FocusTextBox" TargetType="Grid">
        <Style.Triggers>
            <DataTrigger Binding="{Binding ElementName=textBoxName, Path=IsVisible}" Value="True">
                <Setter Property="FocusManager.FocusedElement" Value="{Binding ElementName=textBoxName}"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>

私のグリッド定義では:

<Grid Style="{StaticResource FocusTextBox}" />

2
これも私にとってはうまくいきました。残りはそうではありませんでした。リンクをありがとう、それは非常に面白かった。また、そのような単純なことは非常に複雑になる可能性があることも興味深いです。
TravisWhidden 2015年

2
上記の答えは、コンテナーがGirdであるかStackPanelであるかに関係なく正常に機能します。グリッドの構造が明確ではないため、何が問題だったのかわかりません。代替案を見てうれしいです。
有用なビー

1
私にとっては、これも正しく動作する唯一のものです。いい方法だ。
OregonGhost 2016年

7

他の回答で解決策が見つからない場合は、それで問題を解決できました。

Application.Current.Dispatcher.BeginInvoke(new Action(() =>
{
    TEXTBOX_OBJECT.Focus();
}), System.Windows.Threading.DispatcherPriority.Render);

私が理解しているところによるとFocus()、アプリケーションが他のコンポーネントをレンダリングする前にへの呼び出しが呼び出されるため、他のソリューションは機能しない可能性があります。


3
この答えはより良いランクに値します。
Simon Mourier

0

別の可能な解決策は、無料のDevExpress MVVMフレームワークによって提供されるFocusBehaviorを使用することです

<TextBox Text="This control is focused on startup">
    <dxmvvm:Interaction.Behaviors>
        <dxmvvm:FocusBehavior/>
    </dxmvvm:Interaction.Behaviors>
</TextBox>

これにより、ロードされたとき、特定のイベントが発生したとき、またはプロパティが変更されたときに、コントロールをフォーカスできます。


0

コードビハインドでは、これを行うだけでそれを実現できます。

 private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            txtIndex.Focusable = true;
            txtIndex.Focus();
        }

注:ウィンドウが読み込まれるまで機能しません

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