WPF - 为什么 Keyboard.Focus() 不起作用?

问题描述 投票:0回答:7

TabItem 控件上有一个 TextBox 项 (MyTextBox)。我的代码如下所示:

MyTextBox.Focus();
Keyboard.Focus(MyTextBox);

当我通过调试器运行此代码时,执行行后我会看到以下内容:

MyTextBox.IsFocused = true
MyTextBox.IsKeyboardFocused = false

谁能告诉我为什么文本框没有接收键盘焦点?它只是一个启用的标准 TextBox 控件。

wpf wpf-controls
7个回答
9
投票

当你尝试将 Focus 设置为除我们同事上面列举的之外的元素时,你还必须知道 WPF 不允许跨线程操作。

在某些情况下,不会像 Focus 方法调用情况那样引发此异常。我为解决此问题所做的就是在操作中调用所有涉及键盘焦点的代码。

此操作在控制调度程序内部运行,以确保我的代码不会从 UI 线程之外的另一个线程执行(例如计时器事件或从另一个线程引发的事件):

[UIElement].Dispatcher.BeginInvoke(
      new Action(
         delegate{
             /// put your Focus code here
         }
      )
);

8
投票

MyTextBox.IsKeyboardFocused
是 false,因为您正在调试器下查看它,并且键盘焦点可能在 Visual Studio 中...尝试在没有断点的情况下调试焦点(例如
Debug.Write
或跟踪制动点)以查看
MyTextBox.IsKeyboardFocused
的实际值运行。

另请注意,

Focus()
方法返回布尔值,指示焦点是否已成功设置。在你的情况下它会返回
False
吗?如果是,我建议进入
Focus()
方法以找出问题所在。


7
投票

3个重要的属性必须是

true
IsVisible="True"
Focusable="True"
IsEnabled="True"

要可聚焦,Focusable 和 IsEnabled 必须都为 true。

http://msdn.microsoft.com/en-us/library/system.windows.uielement.focus.aspx


2
投票

无论调试器告诉您什么,这里接受的答案都不能解决文本框没有获得焦点的问题。如果您有并且可以写入文本框,那么您就可以以键盘为中心了。

我发现这里解决了问题(并且实际上获得了焦点,而不仅仅是设置值,使其看起来像调试器中的焦点),它非常接近巴甫洛夫的答案,但带有“焦点代码”:Keyboard.Focus 不在 WPF 中处理文本框


2
投票

前两行代码的执行位置很重要。

如果它们位于与用户按下按键、使用鼠标、更改控件的可见性或以其他方式采取可能影响焦点的操作相关的事件处理程序中,我发现手动调用

Focus()
通常不会没用。

我的理论是,WPF 在内部运行如下:

  1. 用户或代码采取的操作可能会影响焦点,例如TextBox 控件在以前没有可聚焦控件的焦点范围内启用。
  2. WPF 通知各种事件处理程序,包括您调用
    Focus()
    的事件处理程序。
  3. WPF 根据步骤 1 中的状态更改更新焦点。这会覆盖您在步骤 2 中所做的任何操作。

这就是为什么这个答案建议在排队回调中调用您的

Focus()
,该回调将在第3步之后执行。

旁注:您不需要同时调用

UIElement.FocusKeyboard.Focus,因为第一个包含第二个(至少如果您信任 Microsoft 文档)。

总之,将前两行代码替换为:

// using System.Windows.Threading; Dispatcher.BeginInvoke(DispatcherPriority.Input, MyTextBox.Focus);
    

1
投票
这对我有用(必须执行 UpdateLayout,否则 Focus() 在从脚本更改选项卡后不会立即工作)

tabControl.SelectedIndex = 2; this.UpdateLayout(); txtMyTextBox.Focus();
    

0
投票
我也有同样的问题。我只是将所有焦点代码移至元素的可见事件处理程序中。以下代码为我解决了问题:

textBox.IsVisibleChanged += (s, e) => { // any focus code you need. E.g. Keyboard.Focus(textBox); textBox.Focus(); textBox.SelectAll(); };
    
© www.soinside.com 2019 - 2024. All rights reserved.