最近、メイン ウィンドウが最初に読み込まれたときにストーリーボードを介して表示されるログイン スプラッシュ スクリーンの問題を修正しました。
修正には2つの鍵があったと思います。1 つは、包含要素をフォーカス スコープにすることでした。もう 1 つは、ロード中のウィンドウによってトリガーされたストーリーボードの Storyboard Completed イベントを処理することでした。
このストーリーボードにより、ユーザー名とパスワードのキャンバスが表示され、その後フェードして 100% 不透明になります。重要なのは、ストーリーボードが実行されるまでユーザー名コントロールが表示されなかったため、そのコントロールが表示されるまでキーボードフォーカスを取得できなかったことです。しばらく私を失望させたのは、それが「フォーカス」を持っていたことでした (つまり、フォーカスは true でしたが、これは論理フォーカスのみであることが判明しました)。Kent Boogaart を読むまで、WPF に論理フォーカスとキーボード フォーカスの両方の概念があることを知りませんでした。答えて、Microsoft の WPFリンク テキストを見て
それをしたら、特定の問題の解決策は簡単でした:
1) 包含要素をフォーカス スコープにする
<Canvas FocusManager.IsFocusScope="True" Visibility="Collapsed">
<TextBox x:Name="m_uxUsername" AcceptsTab="False" AcceptsReturn="False">
</TextBox>
</Canvas>
2) 完了したイベント ハンドラーをストーリーボードにアタッチする
<Storyboard x:Key="Splash Screen" Completed="UserNamePassword_Storyboard_Completed">
...
</Storyboard>
と
3) ユーザー名の TextBox を設定して、ストーリーボードの完了イベント ハンドラーでキーボード フォーカスを設定します。
void UserNamePassword_Storyboard_Completed(object sender, EventArgs e)
{
m_uxUsername.Focus();
}
item.Focus() を呼び出すと、Keyboard.Focus(this) が呼び出されるため、これを明示的に呼び出す必要はありません。Keyboard.Focus(item) と item.Focus の違いについては、この質問を参照してください。