Как отключить поведение двойного клика в WPF TreeView?

В моем TreeView у меня разные события для MouseDown/MouseUp и т.д., но когда я делаю это достаточно быстро, TreeView расширяет/сворачивает TreeNode. Я не хочу этого запеченного поведения.

Есть ли способ отключить это?

Ответ 1

Вы можете подавить событие двойного щелчка 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;
}

UPDATE

В соответствии с msdn docs:

Хотя это маршрутизируемое событие кажется следовать туннельному маршруту через дерево элементов, это фактически событие, которое поднимается вдоль дерево элементов каждым элементом UIElement... Авторы контроля, которые хотят обрабатывать двойные клики мыши должны использовать Событие PreviewMouseLeftButtonDown, когда ClickCount равно двум. Это будет вызывают состояние надлежащим образом распространяться в случае где другой элемент в элементе дерево обрабатывает событие.

Я не уверен, если у вас возникли проблемы или нет, но мы сделаем это способом 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;
    }
}

Я тестировал это, и он работает независимо от того, сколько раз я нажимаю