首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么TreeViewItem的MouseDoubleClick事件每次双击都会被多次引发?

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

Stack Overflow用户
提问于 2010-02-17 19:05:56
回答 8查看 13.6K关注 0票数 22

XAML

代码语言:javascript
复制
<TreeView Name="GroupView" ItemsSource="{Binding Documents}">
            <TreeView.ItemContainerStyle>
                <Style TargetType="{x:Type TreeViewItem}">
                    <EventSetter Event="MouseDoubleClick" Handler="OnTreeNodeDoubleClick"/>
                </Style>
            </TreeView.ItemContainerStyle>
            ....
</TreeView>

代码隐藏

代码语言:javascript
复制
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选项卡;因此我需要过滤掉额外的调用。

代码语言:javascript
复制
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次。另外,所有的事件参数也是一样的,所以我不能区分一组中的最后一个。

你知道为什么会是这样吗?

EN

回答 8

Stack Overflow用户

发布于 2012-02-04 00:51:11

我知道这是一个古老的问题,但当我在搜索解决方案时遇到了这个问题,这里是我对未来访问者的发现!

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

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

为了应对这种意想不到的行为,按照巴勃罗在回答中的建议,检查是否选择了源TreeViewItem,这对我来说是最有效的。

票数 26
EN

Stack Overflow用户

发布于 2010-10-13 16:05:07

双击TreeViewItem时,将选择该项作为控件行为的一部分。根据特定的场景,可以这样说:

代码语言:javascript
复制
...
TreeViewItem tviSender = sender as TreeViewItem;

if (tviSender.IsSelected)
    DoAction();
...
票数 22
EN

Stack Overflow用户

发布于 2012-10-30 21:35:17

代码语言:javascript
复制
private void TreeView_OnItemMouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    if (e.Source is TreeViewItem
        && (e.Source as TreeViewItem).IsSelected)
    {
        // your code
        e.Handled = true;
   }
}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2280049

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档