8

WPFアプリケーションに検索画面があります。画面は、TabControlのTabItemにUserControlとして実装されます。ユーザーが[検索]タブに切り替えたときに、特定の1つのフィールドにフォーカスを移したいと思います。

そこで、XamlのUserControlタグにLoadedイベントハンドラーを追加し、Loadedイベントハンドラーで最初のフォーカスを取得したいコントロールのFocusメソッドを呼び出しました。これは、今日使用しているTelerikコントロールライブラリをアップグレードするまではうまく機能しました。ここで、[検索]タブに切り替えると、フォーカスが必要なフィールドにありませんが、どのコントロールにフォーカスがあるのか​​わかりません。

私が焦点を合わせたいフィールドには、他の理由ですでにGotFocus&LostFocusイベントハンドラーがあります。Win Formsでは、LostFocusイベントハンドラー引数が、どのコントロールがフォーカスを取得するかを示していることを思い出しました。そこで、LostFocusハンドラーにブレークポイントを設定し、WPFのLostFocusイベントハンドラーへの引数にその情報が含まれていないことを発見しました。

UserControlのすべてのコントロールにGotFocusハンドラーを配置せずに、フォーカスがどこに向かっているのかをどのように把握できますか?

トニー

4

2 に答える 2

9

Tabキーを押して、フォーカスのあるコントロールを見つけるのに役立つかどうかを確認してください。

このQ/Aで提案されているようにSnoopを使用することもできます: WPFでフォーカスの問題をデバッグするためのヒントはありますか?

手始めに、Snoopは現在フォーカスされている要素と現在のFocusScopeをステータスバーに表示します。

すべてのGotFocusイベントとLostFocusイベントを表示するために取得できます。

1. Run your app.
2. Run Snoop.
3. Choose your app in the dropdown.
4. Click the binoculars ("Snoop") button.
5. On the right pane, click the Events tab.
6. Click to bring down the dropdown.
7. Scroll down to the Keyboard section and check GotKeyboardFocus, LostKeyboardFocus, and optionally the PreviewXXX events.
8. Now do what you need to do to manipulate focus and watch the Snoop window.

同様に、FocusManagerイベントを同じ方法で追跡できます。

于 2012-03-30T01:08:52.093 に答える
9

LostKeyboardFocusイベントの代わりに、添付イベントにブレークポイントを設定してみてくださいLostFocusKeyboardFocusChangedEventArgsどの要素にフォーカスがあり、どこにフォーカスがあるかを示すプロパティを持つクラスを使用します。

private void textBox1_LostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
{
    textBox1.Text = ((FrameworkElement)e.NewFocus).Name ; 
}
于 2012-03-30T04:21:58.393 に答える