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

Joa*_*nge 12 .net c# wpf treeview

在我TreeView,我有MouseDown/ MouseUp等等的不同事件,但当我做得足够快时,TreeView扩展/折叠TreeNode.我不想要这种烘焙行为.

有没有办法禁用它?

J C*_*per 18

您可以像这样抑制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>
Run Code Online (Sandbox Code Playgroud)

码:

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

UPDATE

根据msdn 文档:

尽管此路由事件似乎遵循通过元素树的隧道路由,但它实际上是每个UIElement沿元素树引发的直接路由事件...想要处理鼠标双击的控件作者应使用PreviewMouseLeftButtonDown事件ClickCount等于2.这将导致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>
Run Code Online (Sandbox Code Playgroud)

码:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我测试了这个,无论我点击多少次,它都能正常工作