2012-03-30 212 views
6

私のWPFアプリケーションに検索画面があります。この画面は、TabControlのTabItemにUserControlとして実装されています。ユーザーが[検索]タブに切り替えると、特定のフィールドにフォーカスが移ります。WPFアプリケーションでフォーカスがどこにあるのかを調べるにはどうすればいいですか?

XamlのUserControlタグにLoadedイベントハンドラを追加し、Loadedイベントハンドラに初期フォーカスを設定するコントロールのFocusメソッドを呼び出しました。これは私が今日使用しているTelerikコントロールライブラリをアップグレードするまで素晴らしい結果を出しました。今、私が検索タブに切り替えると、フォーカスは私が持っていたいフィールドにはありませんが、どのコントロールにフォーカスがあるのか​​は分かりません。

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

私のUserControlのすべてのコントロールにGotFocusハンドラを置かずにフォーカスがどこにあるのかわかりますか?

トニー

答えて

5

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

private void textBox1_LostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e) 
{ 
    textBox1.Text = ((FrameworkElement)e.NewFocus).Name ; 
} 
+0

ありがとう、これは私が必要なものです。私はフォーム上にあるチェックボックスに移動したので、フォーカスがどこに行きましたか簡単に分かりませんでした。これは、チェックボックスの内側に点線のボックスを置くことでフォーカスを示しています。あなたが本当にそれを探しているのでなければ、それは小さくて&見るのが難しいです。少なくとも、それは私のアプリケーションにあります。 –

+0

@トニー私はそれが助けてうれしいです。 –

8

タブキーを押すと、それはあなたが焦点でコントロールを見つけることができますかどうかを確認してください。このQ/Aで提案されているように

またSnoopを使用することができます。Any tips on debugging focus issues in WPF?手始めに

は、スヌープは、現在フォーカスのある要素と、ステータスバーに現在の 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のイベントを同じ方法で追跡することができます。

+0

ありがとうございます、私は朝にそのショットを出します。 –

関連する問題