对于简单的问题,对不起,但是我已经搜索了很多博客文章,但我仍然感到困惑.似乎没有人知道有什么区别):
更新:
我的用法:
我通过扩展Control类来创建自定义控件.像ComboBox,但有一些其他的效果.我试图通过设置一个属性来打开和关闭一个Popup:IsDropDownOpen就像一个ComboBox通过GotFocus和LostFocus事件.我不想弹出窗口关闭,当我的Alt Tabed的窗口,但是当我点击一个按钮或者我去一个文本框时,关闭.我做到了
private static void OnGotFocusHandler(object sender,RoutedEventArgs e) { if (e.Handled) return; ((SearchBox)sender).IsDropDownOpen = true; e.Handled = true; } private static void OnLostFocusHandler(object sender,RoutedEventArgs e) { if (e.Handled) return; ((SearchBox)sender).IsDropDownOpen = false; e.Handled = true; }
GotFocus工作.但失落的人没有.如果我在LostKeyboardFocus中做丢失的东西,那么当我的Alt Tab窗口,或者Window进入非活动状态时,该方法被调用,而我不想.我该如何解决?
解决方法
WPF有两个关于焦点的概念.有物理键盘的焦点,有逻辑重点.只有一个元素可以具有键盘焦点(如果应用程序不是活动应用程序,则没有元素将具有键盘焦点).
多个项目可以具有逻辑重点.事实上,您可以创建新的“焦点范围”.根据MSDN:
When keyboard focus leaves a focus scope,the focused element will lose keyboard focus but will retain logical focus. When keyboard focus returns to the focus scope,the focused element will obtain keyboard focus. This allows for keyboard focus to be changed between multiple focus scopes but ensures that the focused element in the focus scope regains keyboard focus when focus returns to the focus scope.
您可以通过设置FocusManager.IsFocusScope =“True”,在元素(通常为Panel)上定义自己的焦点范围. WPF中的控件默认为焦点范围是Window,MenuItem,ToolBar和ContextMenu.
如果您考虑在应用程序中安装多个Windows,这是有道理的.当您之间的Alt-Tab,您期望您的键盘焦点返回到上一次窗口焦点的同一个地方.通过保持键盘焦点和逻辑焦点分开,您可以实现这一点.