1. ホーム
  2. wpf

[解決済み】WPFとイニシャルフォーカス

2022-04-11 23:32:43

質問

WPFアプリケーションの起動時に、何もフォーカスが当たらないようなのですが。

これは本当に不思議なことです。私が使用した他のすべてのフレームワークは、あなたが期待したとおりに、タブ順序の最初のコントロールに最初のフォーカスを置きます。しかし、私のアプリだけでなく、WPFであることを確認しました。新しいウィンドウを作成して、そこにテキストボックスを置き、アプリを実行すると、テキストボックスをクリックするか、Tabキーを押すまで、テキストボックスにフォーカスがありません。うっそー。

私の実際のアプリは、単なるテキストボックスよりも複雑です。UserControlsの中にUserControlsを何層にも重ねています。これらのUserControlsの1つは、Focusable="True"とKeyDown/KeyUpハンドラを持っており、ウィンドウが開くとすぐにフォーカスを持つようにしたいのです。私はまだWPFの初心者ですが、これを行う方法を見つけるのに苦労しています。

アプリを起動して Tab キーを押すと、フォーカスがフォーカス可能なコントロールに移動し、私の望むように動作し始めます。しかし、ユーザーがウィンドウを使い始める前にTabキーを押す必要があるのは困ります。

FocusManager.FocusedElement を使ってみましたが、どのコントロール(トップレベルの Window か、フォーカス可能なコントロールを含む親コントロールか、フォーカス可能なコントロール自体か)に設定すればよいのか、何を設定すればよいのかよくわかりません。

ウィンドウが開くと同時に、深くネストしたコントロールに初期フォーカスを持たせるには、どうしたらよいでしょうか。あるいは、タブ順序で最初のフォーカス可能なコントロールにフォーカスするのが良いですか?

解決方法は?

思い立って、Reflector で Focusable プロパティが使われている場所を調べてみたところ、この解決策にたどり着きました。Window のコンストラクタに次のコードを追加するだけです。

Loaded += (sender, e) =>
    MoveFocus(new TraversalRequest(FocusNavigationDirection.First));

これは、タブ順序の最初のコントロールが自動的に選択されるので、どのウィンドウにもドロップしてJust Workできる一般的なソリューションと言えます。