WPF 打开新窗口 如何设置 焦点还在原来的窗口 谢谢
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF 打开新窗口 如何设置 焦点还在原来的窗口 谢谢相关的知识,希望对你有一定的参考价值。
我是打开一个 手写的软键盘窗口 打开后 原来界面上的text框失去焦点 导致无法输入
参考技术A 好像可以设置逻辑焦点,当界面激活的时候, 在焦点范围具有逻辑焦点的控件自动获得焦点设置焦点范围 FocusManager.SetIsFocusScope
设置逻辑焦点 FocusManager.SetFocusedElement
焦点范围是一个容器元素,该元素跟踪其焦点范围内的 FocusManager.FocusedElement。 默认情况下,Window 类与 Menu、ContextMenu 和ToolBar 类一样,是一个焦点范围。 作为焦点范围的元素的 IsFocusScope 设置为 true。
将焦点放在 WPF ComboBox 上并不总是有效
【中文标题】将焦点放在 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 打开新窗口 如何设置 焦点还在原来的窗口 谢谢的主要内容,如果未能解决你的问题,请参考以下文章