如何在双击时禁用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"
将命名空间添加到您的视图中
然后将<i:EventTrigger EventName="MouseDoubleClick">
替换为<local:HandlingEventTrigger EventName="PreviewMouseDoubleClick">
。
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中树项的展开/折叠的主要内容,如果未能解决你的问题,请参考以下文章
安装程序在使用 Process.Start() 启动时失败,但在双击时工作
是否可以在 Intellij/AS 中使用“CamelHumps”选项,但让它在双击时选择字段/方法等的全名?