【问题标题】:Detect when a ListBoxItem is in the SelectedUnfocused state检测 ListBoxItem 何时处于 SelectedUnfocused 状态
【发布时间】: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 具有 IsKeyboardFocusWithinIsSelected 属性,因此您可以创建 MultiTrigger 来满足您的需求
  • 这似乎不起作用。如果我使用这些条件创建 MultiTrigger,则不允许在 Setters 集合中设置 IsSelected。
  • 如果没有,您也可以直接在窗口中添加一个检查以确保失去焦点。
  • 如果我理解正确的话,只要你留在你的应用程序中它就可以工作,但是当你切换到另一个应用程序时它就不起作用了。在我看来,这似乎是可取的,因为当您返回应用程序时,焦点仍将位于 ListBox 上,用户可能希望找到处于其离开状态的应用程序;直到用户单击应用程序内的其他任何位置。如果你真的想要你描述的行为,我想你需要检查 Window.Activated 状态。

标签: c# wpf listbox focus visualstates


【解决方案1】:

使用LostKeyboardFocus 事件。 LostFocus 和 LostKeyboardFocus 是有区别的。

详情请见this question,因为它可能有助于回答您的问题。

【讨论】:

  • 谢谢,这正是我想要的。知道我错过了一些明显的东西:)