如何在TreeView用户控件中定义TreeViewItem触发器

时间:2018-12-14 14:00:05

标签: wpf wpf-controls wpf-style

我创建了允许多重选择的TreeView用户控件。为了直观显示所选项目,我在Style的{​​{1}}中使用了触发器。此样式在用户控件资源中定义如下:

TreeViewItem

但是当我想使用此控件时,我想为<TreeView x:Class="SchoolsExample.MultiSelectionTreeView" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" mc:Ignorable="d" xmlns:local="clr-namespace:SchoolsExample" d:DesignHeight="300" d:DesignWidth="300" SelectedItemChanged="TreeView_SelectedItemChanged"> <TreeView.Resources> <Style TargetType="TreeViewItem"> <EventSetter Event="PreviewMouseLeftButtonDown" Handler="TreeViewItem_MouseLeftButtonDown"/> <EventSetter Event="MouseLeftButtonUp" Handler="TreeViewItem_MouseLeftButtonUp"/> <Style.Triggers> <Trigger Property="local:MultiSelectionTreeViewItemBehaviour.IsMultiSelected" Value="True"> <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/> <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}"/> </Trigger> <MultiDataTrigger> <MultiDataTrigger.Conditions> <Condition Binding="{Binding Path=(local:MultiSelectionTreeViewItemBehaviour.IsMultiSelected), RelativeSource={RelativeSource Self}}" Value="True"/> <Condition Binding="{Binding IsSelectionActive, RelativeSource={RelativeSource Self}}" Value="False"/> </MultiDataTrigger.Conditions> <MultiDataTrigger.Setters> <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.InactiveSelectionHighlightBrushKey}}"/> <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.InactiveSelectionHighlightTextBrushKey}}"/> </MultiDataTrigger.Setters> </MultiDataTrigger> </Style.Triggers> </Style> </TreeView.Resources> </TreeView> 设置如下样式:

TreeViewItem

然后我得到一个例外,说我不能两次设置 <local:MultiSelectionTreeView x:Name="MultiSelectionTreeView" ItemsSource="{Binding Schools}"> <local:MultiSelectionTreeView.Resources> <Style TargetType="TreeViewItem"> <Setter Property="local:MultiSelectionTreeViewItemBehaviour.IsMultiSelected" Value="{Binding IsSelected, Mode=TwoWay}"/> </Style> </local:MultiSelectionTreeView.Resources> <local:MultiSelectionTreeView.ItemTemplate> <HierarchicalDataTemplate ItemsSource="{Binding Pupils}"> <TextBlock Text="{Binding Name}"/> <HierarchicalDataTemplate.ItemTemplate> <DataTemplate> <TextBlock Text="{Binding FullName}"/> </DataTemplate> </HierarchicalDataTemplate.ItemTemplate> </HierarchicalDataTemplate> </local:MultiSelectionTreeView.ItemTemplate> </local:MultiSelectionTreeView> 。即使我设法以某种方式设置Resource的样式,我想要的TreeViewItem的视觉行为也会被覆盖。

我想知道的是,是否有某种方法可以为我在TreeViewItem用户控件中使用的TreeViewItem设置默认的视觉行为,但又允许我设置{{1} } TreeView,当我使用用户控件时。

谢谢。

更新

异常消息:

System.Windows.Markup.XamlParseException:“设置属性'System.Windows.ResourceDictionary.DeferrableContent'引发了异常。行号“ 22”和行位置“ 14”。

内部异常:

InvalidOperationException:无法重新初始化ResourceDictionary实例。

1 个答案:

答案 0 :(得分:0)

最初的问题是因为您不能为控件提供两个资源部分。他们发生碰撞。

由于想法是将树视图本身公开为控件,因此您需要其他方法来传递额外的样式。 一种方法是使用依赖项属性。  然后,控件本身中的代码可以获取您传入的所有内容,并将其添加到已经具有的样式中。这不是一个很好的解决方案,但它的好处是可以相当直接地进行,而不会强迫您重做控件的工作方式。