Как определить триггеры TreeViewItem в пользовательском элементе управления TreeView - PullRequest
0 голосов
/ 14 декабря 2018

Я создал пользовательский элемент управления 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.

1 Ответ

0 голосов
/ 14 декабря 2018

Первоначальная проблема заключается в том, что у вас не может быть двух разделов ресурсов для элемента управления.Они сталкиваются.

Так как идея состоит в том, чтобы представить само древовидное представление как элемент управления, тогда вам нужен другой способ передать дополнительные стили.Один из способов сделать это - использовать свойство зависимости.Код в самом элементе управления может затем захватить все, что вы передаете, и добавить его к уже имеющемуся стилю.Не очень хорошее решение, но оно имеет преимущество, заключающееся в том, что он достаточно прямолинеен, не заставляя вас переделывать способ управления.

...