Я создал пользовательский элемент управления TreeView, который разрешает множественный выбор.Для визуального отображения выбранных элементов я использую триггеры в Style
для 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
s примерно так:
<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
s, то визуальное поведение, которое я хочу для TreeViewItem
s, будет перезаписано.
Я хочу знать, есть ли какой-то способустановить визуальное поведение по умолчанию для TreeViewItem
s, которые я использую в своем TreeView
пользовательском элементе управления, и, тем не менее, разрешить мне установить Style
для этих TreeViewItem
s, когда я использую пользовательский элемент управления.
Спасибозаранее.
Обновление:
Сообщение об исключении:
System.Windows.Markup.XamlParseException: '' Установить свойство'System.Windows.ResourceDictionary.DeferrableContent' вызвал исключение. 'Номер строки '22' и позиция строки '14'. '
Внутреннее исключение:
InvalidOperationException: Невозможно повторно инициализировать экземпляр ResourceDictionary.