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

2024-01-05

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 次。此外,所有事件参数参数也相同,因此我无法区分一组中的最后一个。

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


我知道这是一个老问题,但当我在寻找解决方案时遇到它时,以下是我的发现,供未来的访问者参考!

TreeViewItems 递归地相互包含。TreeViewItem is a HeaderedContentControl (see msdn http://msdn.microsoft.com/en-us/library/system.windows.controls.treeviewitem.aspx),子节点为Content。所以,每个TreeViewItem的边界包括其所有子项。这可以使用优秀的WPF 检查员 http://wpfinspector.codeplex.com/通过选择一个TreeViewItem在视觉树中,这将突出显示TreeViewItem.

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 TreeViewItem 的 MouseDoubleClick 事件每次双击都会引发多次? 的相关文章

随机推荐