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

oyxsuwqo  于 2023-02-25  发布在  其他
关注(0)|答案(6)|浏览(328)

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

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

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

MyTextBox.IsFocused = true
MyTextBox.IsKeyboardFocused = false

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

v1l68za4

v1l68za41#

当您尝试将Focus设置为我们的团队上面列举的内容之外的元素时,您还必须知道WPF不允许跨线程操作。
在某些情况下,这个异常并不像Focus方法调用那样被引发。我所做的就是在一个操作中调用所有涉及键盘焦点的代码来解决这个问题。
此操作在控件调度程序内运行,以确保我的代码不是从UI线程以外的其他线程执行的(例如,计时器事件或从其他线程引发的事件):

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

cnjp1d6j2#

MyTextBox.IsKeyboardFocused为false,因为您正在调试器下查看它,并且键盘焦点可能在Visual Studio中...请尝试不使用断点(例如Debug.Write或跟踪断点)调试焦点,以查看MyTextBox.IsKeyboardFocused在运行时的实际值。
还要注意Focus()方法返回的布尔值表示焦点是否成功设置。在您的例子中,它返回False吗?如果是,我建议使用stepping intoFocus()方法,以便找出错误。

ljsrvy3e

ljsrvy3e3#

3个重要属性必须为true:一米一纳米一x一米二纳米一x一米三纳米一x
若要可聚焦,Focusable和IsEnabled必须同时为true。
http://msdn.microsoft.com/en-us/library/system.windows.uielement.focus.aspx

ss2ws0br

ss2ws0br4#

这里可接受的答案并不能解决文本框不获得焦点的问题,无论调试器告诉你什么。如果你有并且可以写入你的文本框,那么你就有了它的键盘焦点。
我发现这解决了问题(实际上获得了焦点,而不仅仅是设置值,使其在调试器中看起来像焦点),它非常接近巴甫洛夫的答案,但使用了“焦点代码”:Keyboard.Focus does not work on text box in WPF

enyaitl3

enyaitl35#

这对我很有效(必须进行UpdateLayout,否则Focus()在从脚本更改选项卡后无法立即工作)

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

yuvru6vn6#

前两行代码在哪里执行很重要。
如果它们位于与用户按键、使用鼠标、更改控件的可见性或采取可能影响焦点的其他操作相关的事件处理程序中,我发现手动调用Focus()通常不起作用。
我的理论是,WPF内部运作如下:
1.用户或代码执行了可能影响焦点的操作,例如,TextBox控件在以前没有可聚焦控件的焦点范围内启用。

  1. WPF通知各种事件处理程序,包括调用Focus()的事件处理程序。
  2. WPF根据步骤1中的状态更改更新焦点。这将重写您在步骤2中所做的任何操作。
    这就是为什么this answer建议在排队回调中调用您的Focus(),该回调将在步骤3 * 之后 * 执行。
    边注:您不需要同时调用UIElement.FocusKeyboard.Focus,因为第一个包含第二个(至少如果您信任Microsoft文档)。
    最后,将前两行代码替换为:
// using System.Windows.Threading;
Dispatcher.BeginInvoke(DispatcherPriority.Input, MyTextBox.Focus);

相关问题