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

时间:2011-02-01 21:26:01

标签: wpf wpf-controls

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

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

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

MyTextBox.IsFocused = true
MyTextBox.IsKeyboardFocused = false

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

4 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:8)

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

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

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

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

答案 2 :(得分:4)

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

要成为焦点,Focusable和IsEnabled必须都是真的。

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

答案 3 :(得分:1)

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

我发现这里解决了这个问题(并且实际上获得了焦点,而不仅仅是设置值,所以它看起来像调试器中的焦点),它非常接近巴甫洛夫的答案,但是#34;焦点代码" :Keyboard.Focus does not work on text box in WPF