Keyboard.Focus在WPF中的文本框上不起作用

我正在敲打看起来像是一个简单的问题来修复wpf,但我还没有发现为什么我不能让我的应用程序按照我的计划行事。

当用户按下ctrl + f时,我的wpf应用程序中会弹出一个小搜索框。 我想要的只是插入符号在搜索框文本框内闪烁,准备好接受任何用户输入而无需用户点击它。 以下是文本框的xaml代码,该代码可见,启用,命中可测试,tabstopable和focusable。

 

在后面的代码中,我在搜索框的可见性受到影响时调用此方法。 搜索框在应用程序的开头加载。

  ///  /// Handles events triggered from focusing on this view. ///  /// The sender. /// The key event args. private void OnIsVisibleChanged(object sender, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs) { if (!((bool) dependencyPropertyChangedEventArgs.NewValue)) { return; } SearchCriteriaTextBox.Focus(); Keyboard.Focus(SearchCriteriaTextBox); SearchCriteriaTextBox.Select(0, 0); if (SearchCriteriaTextBox.Text.Length > 0) { SearchCriteriaTextBox.SelectAll(); } } 

问题是,代码被调用,组件变为IsFocused = true但没有获得键盘焦点。 我错过了什么吗? 除非另一个控件狠狠地保持键盘焦点,我很确定我没有编码,为什么这段相当简单的代码不能正常工作。

作为一种变通方法,您可以尝试使用Dispatcher将焦点设置为稍后的DispatcherPriority ,例如Input

 Dispatcher.BeginInvoke(DispatcherPriority.Input, new Action(delegate() { SearchCriteriaTextBox.Focus(); // Set Logical Focus Keyboard.Focus(SearchCriteriaTextBox); // Set Keyboard Focus })); 

从你的问题的描述,听起来你没有键盘焦点设置。 WPF可以有多个焦点范围,因此多个元素可以具有逻辑焦点( IsFocused = true ),但是只有一个元素可以具有键盘焦点并且将接收键盘输入。

您发布的代码应该正确设置焦点,因此必须先发生一些事情才能将键盘焦点移出TextBox 。 通过将焦点设置为稍后的调度程序优先级,您将确保将SearchCriteriaTextBox键盘焦点设置为最后完成。

如果它有助于任何人我遇到这个问题,我的应用程序有一个主窗口,其中多个用户控件放置在具有可见性数据绑定的单独网格中。 因为在构建应用程序时网格存在,所以在构建时调用在Loaded或Constructor上调用的.Focus(),而不是在可见时。

无论如何我通过在网格的MouseEnter事件上调用.Focus()来修复它。 对我来说很好。