如何在双击时禁用WPF TreeView中树项的展开/折叠

Posted

技术标签:

【中文标题】如何在双击时禁用WPF TreeView中树项的展开/折叠【英文标题】:How to disable expanding/collapsing of tree items in WPF TreeView on double-click 【发布时间】:2019-04-27 05:22:43 【问题描述】:

当我双击树项目时,如何禁用树项目折叠/展开?我仍然想通过单击切换按钮来做到这一点,但不是当我双击项目时。

这是我拥有的 XAML:

<TreeView Grid.Column="0" Grid.Row="0" ItemsSource="Binding Categories" helpers:TreeViewHelper.SelectedItem="Binding SelectedCategory, Mode=TwoWay" >
    <TreeView.ItemContainerStyle>
        <Style TargetType="x:Type TreeViewItem">
            <Setter Property="IsExpanded" Value="True"/>
        </Style>
    </TreeView.ItemContainerStyle>
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate DataType="x:Type core:Category" ItemsSource="Binding SubCategories">
            <Label Content="Binding Name">
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="MouseDoubleClick">
                        <i:InvokeCommandAction Command="Binding RelativeSource=RelativeSource AncestorType=Window, Path=DataContext.CreateGroupsFromCategoryCommand , Mode=OneWay" CommandParameter="Binding" />
                    </i:EventTrigger>
                </i:Interaction.Triggers>
            </Label>
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>

我只想在 XAML 中执行此操作。

感谢您的帮助。

【问题讨论】:

【参考方案1】:

你应该禁止 treeviewitem 上的双击事件:

<TreeView Grid.Column="0" Grid.Row="0" ItemsSource="Binding Categories" helpers:TreeViewHelper.SelectedItem="Binding SelectedCategory, Mode=TwoWay" TreeViewItem.PreviewMouseDoubleClick="TreeViewItem_PreviewMouseDoubleClick" >
    <TreeView.ItemContainerStyle>
        <Style TargetType="x:Type TreeViewItem">
            <Setter Property="IsExpanded" Value="True"/>
        </Style>
    </TreeView.ItemContainerStyle>
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate DataType="x:Type core:Category" ItemsSource="Binding SubCategories">
            <Label Content="Binding Name">
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="MouseDoubleClick">
                        <i:InvokeCommandAction Command="Binding RelativeSource=RelativeSource AncestorType=Window, Path=DataContext.CreateGroupsFromCategoryCommand , Mode=OneWay" CommandParameter="Binding" />
                    </i:EventTrigger>
                </i:Interaction.Triggers>
            </Label>
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</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;

【讨论】:

不幸的是,这没有按预期工作。我通过事件触发器双击具有特殊功能,并且使用这种方法,命令调用也被抑制。另一个问题是,如果您在项目上快速单击多次,该项目偶尔仍会折叠/展开【参考方案2】:

您可以在后面的视图代码中实现自定义 EventTrigger,如下所示:https://***.com/a/7688249/1206431

public class HandlingEventTrigger : System.Windows.Interactivity.EventTrigger

    protected override void OnEvent(System.EventArgs eventArgs)
    
        var routedEventArgs = eventArgs as RoutedEventArgs;
        if (routedEventArgs != null)
            routedEventArgs.Handled = true;

        base.OnEvent(eventArgs);
    

像这样xmlns:views="clr-namespace:YourNamespace.Views"将命名空间添加到您的视图中

然后将&lt;i:EventTrigger EventName="MouseDoubleClick"&gt; 替换为&lt;local:HandlingEventTrigger EventName="PreviewMouseDoubleClick"&gt;

HandlingEventTrigger 将阻止事件进一步向上传递可视化树,因此不会展开/折叠您的树,并使用 PreviewMouseDoubleClick 而不是 MouseDoubleClick 将允许您仍然触发自己的命令。

【讨论】:

【参考方案3】:

XAML:

<TreeView x:Name="TreeView1" MouseDoubleClick="TreeView1_MouseDoubleClick" />

C#代码:

private void TreeView1_MouseDoubleClick(object sender, System.Windows.Input.MouseButtonEventArgs e)

    e.Handled = true;

对我来说很好。

【讨论】:

一个好的答案将始终包括解释为什么这会解决问题,以便 OP 和任何未来的读者可以从中学习。

以上是关于如何在双击时禁用WPF TreeView中树项的展开/折叠的主要内容,如果未能解决你的问题,请参考以下文章

Flutter 验证器仅在双击时触发

安装程序在使用 Process.Start() 启动时失败,但在双击时工作

是否可以在 Intellij/AS 中使用“CamelHumps”选项,但让它在双击时选择字段/方法等的全名?

WPF Datagrid在鼠标双击时编辑单元格

gtkmm treeview set_activate_on_single_click 无法编译

Jquery - 双击时遇到麻烦,因为类的变化