单击相关选项卡后,我立即使用了以下方法。
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.GotFocus
和 Selector.SelectionChanged
是bubbling events这意味着它们将在可视化树中冒泡,并且事件处理程序将在引发此路由事件的每个子级的父控件上触发。在 GotFocus
事件的情况下,每个 UIElement
和 SelectionChanged
将由每个 Selector
触发ComboBox
、ListBox
、ListView
或 DataGrid
等控件。
您仍然应该能够像这样处理 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/