TabItem 在单击放置在其中的任何控件时触发 FocusGot 事件

本文关键字:控件 事件 FocusGot 任何 单击 在其中 TabItem | 更新日期: 2023-09-27 18:36:08

一旦

我单击有问题的选项卡,我就会点击下面的方法。

private void Tab1_GotFocus(Object sender, RoutedEventArgs eventArgs) 
{
  DoStuff();
}

但是,我注意到,当我单击该选项卡上放置的任何控件时,也会触发该事件。我可以关闭该行为吗?我可以检测事件是"真实"还是"只是为了好玩"吗?

我脑海中的一个小声音告诉我将焦点与丢失的内容进行比较,如果它是相同(或幼稚的)组件,请跳过该方法。但这听起来很奇怪...

private void Tab1_GotFocus(Object sender, RoutedEventArgs eventArgs)
{
  if(sender == eventArgs.OriginalSource)
    DoStuff();
}

相反,我正在尝试使用以下内容。

private void TabControl_OnSelectionChanged(Object sender, SelectionChangedEventArgs eventArgs)
{
  ...
}

然而,它被发射,然后由于我在里面做了一些事情而重新发射。(更改选择时,我更新其中一个选项卡上包含的数据网格。我怀疑排序和/或过滤可能会导致这些问题。

这是正确的方法吗?

TabItem 在单击放置在其中的任何控件时触发 FocusGot 事件

如注释中所述,UIElement.GotFocusSelector.SelectionChanged 都是冒泡事件,这意味着它们将在可视化树中冒泡,并且事件处理程序将在父控件上为引发此路由事件的每个子控件触发。如果发生GotFocus事件,它将是每个UIElementSelectionChanged将由每个Selector控件触发,如ComboBoxListBoxListViewDataGrid

您仍然应该能够处理这样的事件SelectionChanged只是忽略e.OriginalSourceTabControl的每个调用

private void TabControl_OnSelectionChanged(
  Object sender, SelectionChangedEventArgs eventArgs)
{
  var tabControl = eventArgs.OriginalSource as TabControl;
  if (tabControl != null)
    SolveAllProblems();
}

这不是万无一失的,如果你有TabControl作为TabControl的孩子,它仍然会被触发。如果它只应该处理特定的选项卡,以下内容就可以了。

private void TabControl_OnSelectionChanged(
  Object sender, SelectionChangedEventArgs eventArgs)
{
  if ((eventArgs.OriginalSource as TabControl)?.SelectedItem == TabToBeHandled)
    SolveAllProblems();
}

请注意 .NET 的很酷的新增功能 - 令人惊讶的点(合并运算符)。