2012-10-12 39 views
7

私は、たくさんのものを含むメインウィンドウを持つアプリケーションを持っています。時々、ユーザーは応答として何かをします。私はそれ以外のものをメインウィンドウに完全に表示したいのですが、そこにあるものを一時的に隠してしまいます。WPF:ユーザーコントロールにキーボードフォーカスを設定しますか? (キーバインドの問題)

私は、メインウィンドウの最も外側の要素を行または列が定義されていないグリッドにすることでこれを行います。グリッド内のすべての要素は、グリッド内の1つのセルを完全に埋めて、他の要素の上に描画します。

グリッドの最初の要素に私の定期的な束のものがあり、私の一時的なものはグリッドの2番目の要素としてUserControlで、通常Visibility = Collapsedに設定されています。

KeyBindingを除いて、すべて正常に動作します。通常の束の中で適切なコマンドが起動されると、UserControlの可視性はVisibleに設定され、通常の束を完全にカバーします。ユーザーがUserControlの閉じるボタンをクリックすると、可視性が再びCollapsedに設定され、消えて、定期的なものが公開されます。

私の問題はKeyBindingsにあります。私はUserControl上で定義されたいくつかを持っています - それはメインウィンドウで定義すべきではありません - そして、それらはうまくいきません。 UserControlの内部をクリックすると、むしろうまく動作しますが、それまでは機能しません。

UserControlを適切にクリックしたりタブする必要なく、UserControlが表示されるとすぐに作業する必要があります。

これはキーボードフォーカスと関係がありますが、私はUserControlにフォーカスを設定する方法を見つけることができませんでした。ここでは、UserControl内の唯一の要素はタブコントロールであり、そのタブはすべてテンプレートを介して動的に構築されています。コンパイル時に明示的に参照してKeyBoard.Focus()に渡すことができる要素はありません。

だから、問題を引き起こしているのは焦点の欠如だと思うのですか?もしそうなら、タブコントロールの要素にフォーカスを設定するにはどうしたらいいですか?

+0

なぜユーザーコントロールに直接フォーカスしないのですか?同様に、Keyboard.Focus(userControl)? –

+0

大きな質問です。それは動作しません。コントロールのKeyBoard.Focus()を呼び出すことはできますが、コントロールのGotFocusメソッドは起動しません。 –

+1

しかし、コントロールにFocusable = "True"を設定した場合、それは行います。正しい場所を見てくれてありがとう。 –

答えて

9

私は、このコントロールが目に見えたときにフォーカスを持っていたかったのです。したがって、コンストラクタでは、IsVisibleChangedにハンドラを設定しました。

public MyControl 
{ 
    ... 
    this.IsVisibleChanged += new DependencyPropertyChangedEventHandler(MyControl_IsVisibileChanged); 
} 

void MyControl_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e) 
{ 
    if (!(bool(e.NewValue) 
     return; 
    this.Focusable = true; 
    Keyboard.Focus(this); 
} 

関連するコードの全てが一つの場所にあるように、私は、XAMLでFocusableの設定されている可能性がありますが、私はコードビハインドでそれを好みます。

関連する問題