将焦点放在 WPF ComboBox 上并不总是有效

Posted

技术标签:

【中文标题】将焦点放在 WPF ComboBox 上并不总是有效【英文标题】:Setting focus on WPF ComboBox not always working 【发布时间】:2012-07-10 18:23:25 【问题描述】:

我有一个解决方案,它有两个项目,一个主要项目和一个也使用的小型共享控件。在我们的应用程序中,某个功能会在新窗口中打开此共享控件。我想在窗口打开时将焦点设置到此控件中的第一个组合框。

在我的代码中,在加载共享控件的窗口上,在 _Loaded 事件结束时,我将焦点设置到此组合框。但是在运行代码时 - 我仍然必须点击标签才能将“键盘”焦点放在框上(如,我必须点击标签然后开始输入列表中项目之一的名称)。

如果我在这里设置一个断点,点击它,然后继续 - 它实际上是按照它应该的方式设置的。如果我使用 WPF 检查器 - 还设置了 IsFocused。

其他注意事项:

如果我点击 tab(得到我想要的),然后返回 tab,它会将我带到表单上的最后一个控件,而不是这个未知的控件。这让我相信焦点设置正确,但由于某种原因没有正确的键盘焦点。 如果我尝试在代码中使用 MoveNext,它实际上会选择窗口中控件之外的下一项。

如何在此处正确设置焦点?在“主”项目中的另一个组合框上,只需调用 .Focus() 即可正常工作。

【问题讨论】:

【参考方案1】:

在处理完所有事件并使用 QueueUserWorkItem 更新绑定后,尝试推迟 focus()。像这样:

   public  delegate void  VoidDelegate();

    private void Window_Loaded(object sender, RoutedEventArgs e)
    
        // Some other things to do here.
        System.Threading.ThreadPool.QueueUserWorkItem
                       (x => this.Dispatcher.Invoke(
                                  new VoidDelegate(SetFocus), null));
    

    private void SetFocus()
    
        MyControlIWantToSetFocusOn.Focus();
    

【讨论】:

谢谢你,我想过做这样的事情 - 但我想我也只是没有正确设置一些东西。这很好用,我也最终尝试做一个 Dispatcher.BeginInvoke(new ThreadStart(() => theControl.Focus(); ));

以上是关于将焦点放在 WPF ComboBox 上并不总是有效的主要内容,如果未能解决你的问题,请参考以下文章

C# WPF - 组合框

在带有许多线程唤醒的 iOS 8 上并不总是显示 EXC_RESOURCE 崩溃?

WPF虚拟键盘如何不获得当前焦点

wpf combobox样式不显示倒三角

如何让相机聚焦在物体上并使用 Babylonjs 将其保持在中心焦点?

WPF EventTrigger并不总是触发