Я недавно исправил эту проблему для заставки входа в систему, которая отображается через раскадровку при первой загрузке главного окна.
Я думаю, что для исправления было два ключа. Один из них заключался в том, чтобы сделать содержащий элемент фокусом. Другой должен был обработать событие Storyboard Completed для раскадровки, которая была вызвана загружаемым окном.
Эта раскадровка делает видимым холст имени пользователя и пароля, а затем становится на 100% непрозрачным. Ключевым моментом является то, что элемент управления именем пользователя не был виден до запуска раскадровки, и поэтому этот элемент управления не мог получить фокусировку клавиатура , пока он не был виден. На некоторое время меня оттолкнуло то, что он имел «фокус» (то есть фокус был верным, но, как оказалось, это был только логический фокус), и я не знал, что в WPF была концепция как логического, так и клавишного фокуса, пока не прочитал книгу Кента Бугаарта. ответ и глядя на WPF Microsoft текст ссылки
Как только я это сделал, решение моей конкретной проблемы было простым:
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.