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);
}
我发现,对于一次双击,事件处理程序会被多次调用。我试图在双击相应的树节点时打开一个文档in选项卡;因此我需要过滤掉额外的调用。
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次。在一个简单的repro-app上,每次双击它都会被提升2次。另外,所有的事件参数也是一样的,所以我不能区分一组中的最后一个。
你知道为什么会是这样吗?
发布于 2012-02-04 00:51:11
我知道这是一个古老的问题,但当我在搜索解决方案时遇到了这个问题,这里是我对未来访问者的发现!
TreeViewItem
相互递归地包含在一起。TreeViewItem
是一个HeaderedContentControl
(请参见msdn),其子节点是Content
。因此,每个TreeViewItem
的边界包括它的所有子项,这可以通过在可视化树中选择一个TreeViewItem
来使用优秀的TreeViewItem
来验证,这将突出显示该TreeViewItem
的边界。
在OP的示例中,使用样式在每个TreeViewItem
上注册MouseDoubleClick
事件。因此,将分别为您双击的TreeViewItem
及其每个父项引发该事件。通过在双击事件处理程序中放置断点,并在事件参数的Source属性上放置监视,可以在调试器中验证这一点-您会注意到,每次调用事件处理程序时,它都会发生变化。顺便说一句,正如可以预期的那样,事件的OriginalSource
保持不变。
为了应对这种意想不到的行为,按照巴勃罗在回答中的建议,检查是否选择了源TreeViewItem
,这对我来说是最有效的。
发布于 2010-10-13 16:05:07
双击TreeViewItem
时,将选择该项作为控件行为的一部分。根据特定的场景,可以这样说:
...
TreeViewItem tviSender = sender as TreeViewItem;
if (tviSender.IsSelected)
DoAction();
...
发布于 2012-10-30 21:35:17
private void TreeView_OnItemMouseDoubleClick(object sender, MouseButtonEventArgs e)
{
if (e.Source is TreeViewItem
&& (e.Source as TreeViewItem).IsSelected)
{
// your code
e.Handled = true;
}
}
https://stackoverflow.com/questions/2280049
复制相似问题