我创建了允许多重选择的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实例。
答案 0 :(得分:0)
最初的问题是因为您不能为控件提供两个资源部分。他们发生碰撞。
由于想法是将树视图本身公开为控件,因此您需要其他方法来传递额外的样式。 一种方法是使用依赖项属性。 然后,控件本身中的代码可以获取您传入的所有内容,并将其添加到已经具有的样式中。这不是一个很好的解决方案,但它的好处是可以相当直接地进行,而不会强迫您重做控件的工作方式。