gpt4 book ai didi

wpf - 为什么 TreeViewItem 的 MouseDoubleClick 事件每次双击都会引发多次?

转载 作者:行者123 更新时间:2023-12-03 02:07:46 36 4
gpt4 key购买 nike

XAML

<TreeView Name="GroupView" ItemsSource="{Binding Documents}">
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<EventSetter Event="MouseDoubleClick" Handler="OnTreeNodeDoubleClick"/>
</Style>
</TreeView.ItemContainerStyle>
....
</TreeView>

隐藏代码

private void OnTreeNodeDoubleClick(object sender, MouseButtonEventArgs mouseEvtArgs)
{
Console.WriteLine("{3} MouseDoubleClick Clicks={0} ChangedButton={1} Source={2} Handled={4} ButtonState={5}",
mouseEvtArgs.ClickCount, mouseEvtArgs.ChangedButton, mouseEvtArgs.OriginalSource,
mouseEvtArgs.Timestamp, mouseEvtArgs.Handled, mouseEvtArgs.ButtonState);
}

我发现对于一次双击,事件处理程序被调用多次。我试图通过双击相应的树节点来打开选项卡中的文档;所以我需要过滤掉额外的调用。

23479156 MouseDoubleClick Clicks=1 ChangedButton=Left Source=System.Windows.Controls.TextBlock Handled=False ButtonState=Pressed
23479156 MouseDoubleClick Clicks=1 ChangedButton=Left Source=System.Windows.Controls.TextBlock Handled=False ButtonState=Pressed

在我的稍微复杂的应用程序中,每次双击它都会被提升 4 次。在一个简单的重现应用程序上,每次双击它都会被提升 2 次。此外,所有事件参数参数也相同,因此我无法区分一组中的最后一个。

有什么想法为什么会是这样吗?

最佳答案

我知道这是一个老问题,但当我在搜索解决方案时遇到它时,以下是我的发现,供 future 的访问者使用!

TreeViewItem 递归地相互包含。 TreeViewItem 是一个 HeaderedContentControl(请参阅 msdn ),其子节点作为 Content。因此,每个 TreeViewItem 的边界包括其所有子项。这可以使用优秀的 WPF Inspector 进行验证。通过在可视化树中选择一个 TreeViewItem,这将突出显示 TreeViewItem 的边界。

在OP的示例中,使用该样式在每个TreeViewItem上注册MouseDoubleClick事件。因此,将分别为您双击的 TreeViewItem 及其每个父项引发该事件。这可以在调试器中进行验证,方法是在双击事件处理程序中放置一个断点,并在事件参数的 Source 属性上放置一个监视 - 您会注意到每次调用事件处理程序时它都会发生变化。顺便说一句,正如所料,事件的 OriginalSource 保持不变。

为了应对这种意外行为,检查源 TreeViewItem 是否被选中,正如 Pablo 在他的回答中所建议的那样,对我来说效果最好。

关于wpf - 为什么 TreeViewItem 的 MouseDoubleClick 事件每次双击都会引发多次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2280049/

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