【问题标题】:How to disable expanding/collapsing of tree items in WPF TreeView on double-click如何在双击时禁用WPF TreeView中树项的展开/折叠
【发布时间】: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 中执行此操作。

感谢您的帮助。

【问题讨论】:

    标签: wpf xaml mvvm treeview expand


    【解决方案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://stackoverflow.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 和任何未来的读者可以从中学习。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-02
      • 2020-07-22
      • 2010-12-15
      • 2010-11-26
      • 1970-01-01
      • 2013-12-18
      相关资源
      最近更新 更多