gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 21:24:54 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com