11

たくさんのものを含むメインウィンドウがあるアプリがあります。時々、ユーザーは私がメインウィンドウに何か他のものを完全に表示したいことに応じて何かをし、そこにあるものを一時的に隠します。

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

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

KeyBindingを除いて、すべてが正常に機能します。通常の一連のデータで適切なコマンドがトリガーされると、UserControlの可視性が[表示]に設定され、通常の一連のデータが完全にカバーされます。ユーザーがUserControlの閉じるボタンをクリックすると、その可視性は再び折りたたみに設定され、それが消えて通常の束が表示されます。

私の問題はKeyBindingsにあります。UserControlでいくつか定義されていますが、メインウィンドウでは定義されるべきではありませんが、機能しません。むしろ、UserControl内をクリックすると正常に機能しますが、クリックするまで機能しません。

UserControlが表示されるとすぐに、ユーザーがUserControlをクリックまたはタブで移動しなくても、それらが機能するようにする必要があります。

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

それで、私は問題を引き起こしているのは焦点の欠如であると考えるのは正しいですか?もしそうなら、選択されたタブは言うまでもなく、タブがいくつあるかさえわからないときに、TabControlの要素にフォーカスを設定するにはどうすればよいですか?

4

2 に答える 2

12

このコントロールが表示されたときにフォーカスを合わせたいと思いました。そのため、コンストラクターで、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 を設定することもできましたが、関連するすべてのコードが 1 か所に収まるように、コード ビハインドで設定することをお勧めします。

于 2012-10-15T16:03:01.680 に答える