2011-02-01 6 views
14

には、TabItemコントロールのTextBoxアイテム(MyTextBox)があります。私は、次のようなコードを持っている:WPF - Keyboard.Focus()が機能しないのはなぜですか?

MyTextBox.Focus(); 
Keyboard.Focus(MyTextBox); 

行が実行された後、私は以下を参照してください。デバッガからこのコードを実行すると:

MyTextBox.IsFocused = true 
MyTextBox.IsKeyboardFocused = false 

テキストボックスがない理由誰も教えてもらえますキーボードフォーカスを受け取っていますか?これは、有効になっている単なる標準TextBoxコントロールです。

+0

この呼び出しが行われたときにVisibleがこのコントロールをVisibleにしていますか?私はコントロールがこのプロパティのために目に見える必要があると思うセットを賭ける。 – Matt

+0

@Matt - ありがとう。私はそれを確認します。 –

+0

これを再現できません。 'IsFocused'と' IsKeyboardFocused'の両方がTrueとして出てくる –

答えて

8

MyTextBox.IsKeyboardFocusedは、ランタイムでMyTextBox.IsKeyboardFocusedの実際の値を確認するために(例えばDebug.Writeまたはbrakepointsをトレース)デバッガの下でそれを見ていると、キーボードフォーカスがあなたのVisual Studioで、おそらくあるので...ブレークポイントなしに焦点をデバッグしてみfalseです。

また、Focus()メソッドは、フォーカスが正しく設定されたかどうかを示すブール値を返します。あなたのケースではFalseを返しますか?はいの場合は、何が間違っているかを知るためにstepping intoFocus()メソッドを提案します。

8

私たちの同僚が上に列挙した以外の要素にフォーカスを設定しようとすると、WPFがクロススレッド操作を許可しないことも知っている必要があります。

Focusメソッド呼び出しの場合のように、この例外は発生しないことがあります。私がこの問題を解決するために行ったことは、アクションにキーボードフォーカスを含むすべてのコードを呼び出すことです。

このアクションは、私のコードは、UIスレッド以外のスレッドから実行されていないことを確認するために、コントロールディスパッチャ内で実行される(例えば、タイマーイベントまたは別のスレッドから調達イベント):

[UIElement].Dispatcher.BeginInvoke(
     new Action(
     delegate{ 
      /// put your Focus code here 
     } 
    ) 
); 
1

ここ受け入れ答えは関係なく、デバッガがわかります何、フォーカスを得るいけないテキストボックスの問題を解決しません。あなたがテキストボックスを持っていて、あなたのテキストボックスに書き込むことができれば、それはキーボードに集中しています。

私はこれがここでの問題を解決した(それは、デバッガでのフォーカスのように見えるので、実際にフォーカスを得て、単に値を設定しない)、それは非常にパブロフの答えに近いが、「フォーカスコード」が付属しています:Keyboard.Focus does not work on text box in WPF

関連する問題