Шаблон для дерева с выбранными родителями - PullRequest
0 голосов
/ 27 августа 2018

Я создаю шаблон TreeViewItem (каждый вид дерева в приложении должен иметь этот стиль). Когда элемент выбран, все родители этого также будут выбраны. Уровень кулак имеет другой стиль выбора.

пример дерева

Могу ли я сделать это только в шаблоне xaml?

редактировать: фактический шаблон

 <Style x:Key="{x:Type TreeViewItem}"
       TargetType="{x:Type TreeViewItem}">
    <Setter Property="Foreground"
            Value="{DynamicResource MenuForeground}" />
    <Setter Property="FontFamily"
            Value="SourceSansPro" />
    <Setter Property="FontSize"
            Value="16" />
    <Setter Property="HorizontalContentAlignment"
            Value="Left" />
    <Setter Property="VerticalContentAlignment"
            Value="Center" />
    <Setter Property="Cursor"
            Value="Arrow" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type TreeViewItem}">
                <ControlTemplate.Resources>
                    <local:LeftMarginMultiplierConverter Length="30"
                                                         Margin="49"
                                                         x:Key="lengthConverter" />
                    <local:LeftMarginMultiplierConverter Length="30"
                                                         Margin="32.9"
                                                         x:Key="lengthConverter2" />
                </ControlTemplate.Resources>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="auto"/>
                        <ColumnDefinition/>
                    </Grid.ColumnDefinitions>
                    <StackPanel Grid.Column="1">
                        <Border Name="Bd"
                                Background="{TemplateBinding Background}"
                                BorderBrush="{TemplateBinding BorderBrush}"
                                BorderThickness="{TemplateBinding BorderThickness}"
                                Padding="{TemplateBinding Padding}">
                            <Grid Margin="0">
                                <Border Name="Border"
                                        Width="8"
                                        Padding="0"
                                        Background="{DynamicResource MenuBackground}"
                                        VerticalAlignment="Stretch"
                                        HorizontalAlignment="Left"
                                        Visibility="Hidden">
                                    <Border Name="BlueMark"
                                            Background="{DynamicResource MenuOpenedItemBackground}"
                                            VerticalAlignment="Stretch"
                                            HorizontalAlignment="Stretch"
                                            Visibility="Hidden">
                                    </Border>
                                </Border>
                                <ToggleButton x:Name="Expander"
                                              Margin="{Binding Converter={StaticResource lengthConverter2}, RelativeSource={RelativeSource TemplatedParent}}"
                                              Style="{DynamicResource NuclearTreeViewItemToggleButton}"
                                              IsChecked="{Binding Path=IsExpanded, RelativeSource={RelativeSource TemplatedParent}}"
                                              ClickMode="Press" />
                                <ContentPresenter x:Name="PART_Header"
                                                  Margin="{Binding Converter={StaticResource lengthConverter}, RelativeSource={RelativeSource TemplatedParent}}"
                                                  ContentSource="Header"
                                                  HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" />
                            </Grid>
                        </Border>
                        <Border Name="ShadowEffect"
                                Margin="0,0,0,4"
                                Height="2"
                                Background="{DynamicResource MenuBackground}"
                                Visibility="Collapsed">
                            <Border.Effect>
                                <DropShadowEffect BlurRadius="3"
                                                  Color="#000000"
                                                  Direction="330"
                                                  Opacity="1" />
                            </Border.Effect>
                        </Border>
                        <ItemsPresenter x:Name="ItemsHost" />
                    </StackPanel>
                </Grid>
                <ControlTemplate.Triggers>

                    <Trigger Property="IsExpanded"
                             Value="false">
                        <Setter Property="Visibility"
                                Value="Collapsed"
                                TargetName="ItemsHost" />
                    </Trigger>
                    <Trigger  Property="IsExpanded"
                              Value="True">
                        <Setter Property="Visibility"
                                Value="Visible"
                                TargetName="ShadowEffect"/>
                    </Trigger>
                    <Trigger Property="HasItems"
                             Value="false">
                        <Setter Property="Visibility"
                                Value="Hidden"
                                TargetName="Expander" />
                    </Trigger>
                    <Trigger Property="IsSelected"
                             Value="true">
                        <Setter Property="Foreground"
                                Value="{DynamicResource MenuSelectedItemForeground}" />
                        <Setter Property="Background"
                                Value="{DynamicResource MenuSelectedItemBackground}" />
                        <Setter Property="Visibility"
                                Value="Visible"
                                TargetName="Border"/>
                        <Setter Property="Visibility"
                                Value="Visible"
                                TargetName="BlueMark"/>
                    </Trigger>

                    <Trigger Property="IsEnabled"
                             Value="false">
                        <Setter Property="Foreground"
                                Value="{StaticResource {x:Static SystemColors.GrayTextBrushKey}}" />
                    </Trigger>

                    <Trigger Property="IsMouseOver"
                             Value="True"
                             SourceName="Bd">
                        <Setter Property="Background"
                                Value="{DynamicResource MenuItemFocus}" />
                        <Setter Property="Foreground"
                                Value="{DynamicResource MouseOverForeground}" />
                        <Setter Property="Background"
                                Value="{DynamicResource MenuItemFocus}"
                                TargetName="ShadowEffect"/>
                    </Trigger>

                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="ItemsControl.HasItems" Value="False"/>
                            <Condition Property="IsSelected" Value="True"/>
                        </MultiTrigger.Conditions>
                        <Setter Property="Background"
                                Value="{DynamicResource MenuItemActual}" />
                        <Setter Property="Background"
                                TargetName="BlueMark"
                                Value="{DynamicResource MenuItemActual}" />
                    </MultiTrigger>

                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="ItemsControl.HasItems" Value="False"/>
                            <Condition Property="IsMouseOver" Value="True"/>
                            <Condition Property="IsSelected" Value="False"/>
                        </MultiTrigger.Conditions>
                        <Setter Property="Background"
                                TargetName="BlueMark"
                                Value="{DynamicResource MenuItemFocus}" />
                    </MultiTrigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Когда какой-то элемент выбран, я хочу выбрать всех его родителей. Я пытался продемонстрировать ситуацию на картинке. Первый уровень в виде дерева имеет другой стиль, чем другие уровни.

...