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 次。此外,所有事件参数参数也相同,因此我无法区分一组中的最后一个。
有什么想法为什么会这样吗?
我知道这是一个老问题,但当我在寻找解决方案时遇到它时,以下是我的发现,供未来的访问者参考!
TreeViewItem
s 递归地相互包含。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(使用前将#替换为@)