如何在 WPF TreeView 中禁用双击行为?

13

在我的TreeView中,我有不同的事件用于MouseDown/MouseUp等,但是当我操作速度足够快时,TreeView会展开/折叠TreeNode。我不想要这种内置行为。

有没有一种方法可以禁用这个行为?


相关问题在这里:http://stackoverflow.com/questions/6037042/disable-doubleclicks/6037293#6037293 - Matt
2个回答

19
你可以这样禁止TreeViewItem的双击事件:
xaml:
<TreeView DockPanel.Dock="Left" TreeViewItem.PreviewMouseDoubleClick="TreeViewItem_PreviewMouseDoubleClick">
    <TreeViewItem Header="Node Level 1" IsExpanded="True" >
        <TreeViewItem Header="Node Level 2.1" >
            <TreeViewItem Header="MyItem" />
        </TreeViewItem>
        <TreeViewItem Header="Node Level 2.2">
            <TreeViewItem Header="MyItem" />
        </TreeViewItem>
    </TreeViewItem>
</TreeView>

代码:

private void TreeViewItem_PreviewMouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    //this will suppress the event that is causing the nodes to expand/contract 
    e.Handled = true;
}

更新

根据msdn 文档

尽管这个路由事件似乎是通过元素树进行的隧道路由,但实际上它是由每个UIElement沿着元素树引发的直接路由事件......如果控件作者想要处理鼠标双击事件,当ClickCount为2时,应该使用PreviewMouseLeftButtonDown事件。这将导致Handled状态在其他元素处理事件的情况下适当地传播。

我不确定这是不是导致你遇到问题的原因,但我们将按照MSDN的方式使用PreviewMouseLeftButtonDown来解决:

XAML代码:

<TreeView DockPanel.Dock="Left" TreeViewItem.PreviewMouseLeftButtonDown="TreeView_PreviewMouseLeftButtonDown">
    <TreeViewItem Header="Node Level 1" IsExpanded="True">
        <TreeViewItem Header="Node Level 2.1" >
            <TreeViewItem Header="MyItem" />
        </TreeViewItem>
        <TreeViewItem Header="Node Level 2.2">
            <TreeViewItem Header="MyItem" />
        </TreeViewItem>
    </TreeViewItem>
</TreeView>

代码:

private void TreeView_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    if (e.ClickCount > 1)
    {
        //here you would probably want to include code that is called by your
        //mouse down event handler.
        e.Handled = true;
    }
}

我已测试过这个,它可以在无论我点击多少次的情况下都能正常工作。


刚试了一下,但它仍然这样做。我写的是 PreviewMouseDoubleClick 而不是 TreeViewItem.PreviewMouseDoubleClick,这有关系吗? - Joan Venge
刚在一个新项目中尝试了一下,当我点击多次时,它仍然会展开/折叠。就像双击大多数情况下都被抑制了一样,但是超过两次点击,例如三次点击,似乎仍然会展开/折叠。你能试着这样用一下吗?我不知道微软为什么要添加这样的行为。 - Joan Venge
我发现如何通过双击来展开/折叠。首先选择节点,然后双击它,否则第一次单击将用于选择它。但是要选择它,请双击该节点,再双击以展开/折叠。 - Joan Venge
稍等,我在 MSDN 上读到一些有趣的关于这个问题的行为... 我有一个想法。 - J Cooper
兄弟,它可以了,谢谢。真的很不错,难以置信禁用这个讨厌的“功能”竟然如此复杂。 - Joan Venge
显示剩余3条评论

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接