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

标签 c# wpf tabcontrol tabitem tabview

单击相关选项卡后,我立即使用了以下方法。

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)
{
  ...
}

但是,由于我在其中执行的某些操作,它会被解雇然后重新解雇。 (我在更改选择时更新了其中一个选项卡中包含的数据网格。我怀疑排序和/或过滤可能会导致这些问题。)

这是正确的方法吗?

最佳答案

如评论中所述UIElement.GotFocusSelector.SelectionChangedbubbling events这意味着它们将在可视化树中冒泡,并且事件处理程序将在引发此路由事件的每个子级的父控件上触发。在 GotFocus 事件的情况下,每个 UIElementSelectionChanged 将由每个 Selector 触发ComboBoxListBoxListViewDataGrid 等控件。

您仍然应该能够像这样处理 SelectionChanged 事件,只需忽略 e.OriginalSource 不是 TabControl 的每个调用即可

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 的新增功能 - 令人惊讶的点(合并运算符)。

关于c# - TabItem 在单击放置在其中的任何控件时触发 FocusGot 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27743213/

相关文章:

c# - 满足此要求的 WPF 控件或方法是什么?

c# - 在 unity 3d 中检测物体

.net - C# 浏览器组件添加 header 参数

wpf - DataTemplate 中的 RelativeSource 适用于 TabControl 但不适用于 TabItem

winforms - WinForm TabControl : How to hide/show tab headers dynamically?

c# - DataGrid ContextMenu MenuItems 有时被禁用

c# - 如何将 Json 嵌套属性获取到主要属性

c# - 尽管隐式 null 检查,ReSharper 仍对可能的 System.NullReferenceException 发出警告

java - JSP(Java): Encoding byte array and use in JavaScript same in C#

wpf - 克隆 ResourceDictionary 对象