web-dev-qa-db-ja.com

ボタンのクリックでWPFリセットフォーカス

TextBoxToolBarButtonを付けています。 TextBoxと入力してButtonをクリックすると、TextBoxFocusを失ってバインディングが更新されます。 TextBoxUpdateSourceTrigger=PropertyChangedを追加したくありません。しかし、代わりにButtonをクリックすると、Focusをメインウィンドウにリセットします。これにより、現在開いているものがFocusを失い、バインディングが更新されます。

次のようにボタンにOnClickを追加しようとしましたが、機能しないようです。

    private void Button_Click(object sender, RoutedEventArgs e) {
        FocusManager.SetFocusedElement(this, null);
    }

任意のヒントをいただければ幸いです。

ありがとう、ラウル

35
HaxElit

問題は、ツールバーがボタンを別の_FocusManager.FocusScope_に配置することです。これは、ButtonTextBoxの両方が同時に論理フォーカスを受け取り、それぞれが独自のスコープ内にあることを意味します。通常、これは良いことです。メニュー項目とツールバーボタンを選択したときに、メインウィンドウ領域でフォーカスを失いたくないのですが、この場合、実行中の作業が妨げられます。

ツールバーの_FocusManager.IsFocusScope_プロパティをオーバーライドして必要な効果を得ることができますが、他のすべてのツールバーボタンもメインウィンドウ領域からフォーカスを奪うため、これはおそらく最良の計画ではありません。

代わりに、いくつかの簡単なソリューションの1つを使用できます。

  • ボタンをツールバーの外に置きます
  • Focusable = "true"コントロールをメインウィンドウ領域に追加し、ボタンがクリックされたときにフォーカスする
  • textBox.GetBindingExpression(TextBox.TextProperty).UpdateSource()を呼び出して手動で更新を強制する
  • メインウィンドウのコントロールで一時的にFocusable = "true"を設定し、それにフォーカスを設定して、すぐに再度Focusable = "false"を設定します
25
Ray Burns

同様の問題が発生しました。 Enterキーが押されたときにテキストボックスのフォーカスを解除する必要があります。私はこのコードで終わります:

var scope = FocusManager.GetFocusScope(elem); // elem is the UIElement to unfocus
FocusManager.SetFocusedElement(scope, null); // remove logical focus
Keyboard.ClearFocus(); // remove keyboard focus

ダミーコントロールを作成するよりもクリーンで、再利用可能だと思います。しかし、私はこの解決策に自信がありません。しかし、それはうまくいくようです。

33
Dudu