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

Ran*_*der 16 wpf wpf-controls

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

MyTextBox.Focus();
Keyboard.Focus(MyTextBox);
Run Code Online (Sandbox Code Playgroud)

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

MyTextBox.IsFocused = true
MyTextBox.IsKeyboardFocused = false
Run Code Online (Sandbox Code Playgroud)

任何人都可以告诉我为什么文本框没有接收键盘焦点?它只是一个启用的标准TextBox控件.

小智 9

当您尝试将Focus设置为除了我们的coleague上面列举的内容之外的元素时,您还必须知道WPF不允许交叉线程操作.

在某些情况下,不会像在Focus方法调用案例中那样引发此异常.我为解决这个问题所做的是将所有涉及键盘焦点的代码调用到一个动作中.

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

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


Pav*_*kov 8

MyTextBox.IsKeyboardFocused是错误的,因为您在调试器下查看它并且键盘焦点可能在您的Visual Studio中...尝试调试焦点而不使用断点(例如Debug.Write,跟踪制动点)以查看MyTextBox.IsKeyboardFocused运行时的实际值.

另请注意,该Focus()方法返回boolean值,指示焦点是否已成功设置.它会False在你的情况下返回吗?如果是,我会建议踩到 Focus()方法,以找出问题所在.


leg*_*ing 5

3个重要属性必须是trueIsVisible="True"Focusable="True"IsEnabled="True"

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

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