【发布时间】:2015-05-07 18:27:27
【问题描述】:
问题
每当用户单击它之外的任何位置时,我都希望我的列表框 UnselectAll()。
到目前为止我做了什么
以下代码适用于应用程序内的所有点击:
private void ListBox_LostFocus(object sender, RoutedEventArgs e)
{
((ListBox)sender).UnselectAll();
}
单击列表框外的任何内容都会使其失去焦点,然后取消选择列表框内的所有内容。太好了。
但是,如果我单击应用程序主窗口外的某些内容,我不会从 ListBox 或 ListBoxItem 获得 LostFocus 事件。相反,ListBoxItem 进入 SelectedUnfocused 状态。据我所知,除了订阅 Storyboard.Completed 的 SelectedUnfocused 视觉状态故事板的事件,或者侦听 Window.Activated/Deactivated 事件,然后通过用户界面。我觉得我遗漏了一些明显的东西,如果可能的话,我想避免那种程度的骇客。
问题
显然,WPF 能够检测到这种情况 - 它将控件置于正确的视觉状态 - 那么我是否有一些干净的方法来做同样的事情?
【问题讨论】:
-
ListBoxItem具有IsKeyboardFocusWithin和IsSelected属性,因此您可以创建MultiTrigger来满足您的需求 -
这似乎不起作用。如果我使用这些条件创建 MultiTrigger,则不允许在 Setters 集合中设置 IsSelected。
-
如果没有,您也可以直接在窗口中添加一个检查以确保失去焦点。
-
如果我理解正确的话,只要你留在你的应用程序中它就可以工作,但是当你切换到另一个应用程序时它就不起作用了。在我看来,这似乎是可取的,因为当您返回应用程序时,焦点仍将位于 ListBox 上,用户可能希望找到处于其离开状态的应用程序;直到用户单击应用程序内的其他任何位置。如果你真的想要你描述的行为,我想你需要检查 Window.Activated 状态。
标签: c# wpf listbox focus visualstates