最近我解决了一个问题,即通过故事板显示登录闪屏,当主窗口首次加载时。我认为解决这个问题有两个关键点。一是将包含元素设置为焦点范围。另一个是处理由加载窗口触发的故事板完成事件。
该故事板使用户名和密码画布可见,然后渐变为100%不透明。关键在于,在故事板运行之前,用户名控件是不可见的,因此该控件无法获得键盘焦点直到它可见。让我感到困惑一段时间的是,它具有“焦点”(即焦点为true),但事实证明这只是逻辑焦点,并且我不知道WPF有逻辑焦点和键盘焦点的概念,直到阅读了Kent Boogaart的答案并查看了Microsoft的WPF 链接文本 。
一旦我做到了这一点,我的特定问题的解决方案就很简单:
1) 将包含元素设置为焦点范围
<Canvas FocusManager.IsFocusScope="True" Visibility="Collapsed">
<TextBox x:Name="m_uxUsername" AcceptsTab="False" AcceptsReturn="False">
</TextBox>
</Canvas>
2) 将已完成的事件处理程序附加到Storyboard。
<Storyboard x:Key="Splash Screen" Completed="UserNamePassword_Storyboard_Completed">
...
</Storyboard>
并且
3) 在故事板完成事件处理程序中将我的用户名文本框设置为键盘焦点。
void UserNamePassword_Storyboard_Completed(object sender, EventArgs e)
{
m_uxUsername.Focus();
}
请注意,调用 item.Focus() 会导致调用 Keyboard.Focus(this),因此您不需要显式地调用此方法。有关 Keyboard.Focus(item) 和 item.Focus 之间的区别,请参见此问题:
什么是 Keyboard.Focus(item) 和 item.Focus 之间的区别?