Триггер TreeView.IsSelected не работает должным образом - PullRequest
2 голосов
/ 02 февраля 2012

Я пытаюсь изменить шаблон SelectedItem в TreeView. Я написал простой стиль контейнера и изменил шаблон элемента в Style.Triggers, как описано

[1]: Как выделить выбранный вид дерева в некотором цвете? или

[2]: WPF TreeView: Как оформить выделенные элементы закругленными углами, как в Explorer , но это не работает.

Затем я создал новый проект и создал TreeView с простым стилем и шаблоном

<TreeView>
        <TreeViewItem Header="Item1" />
        <TreeViewItem Header="Item2" />
        <TreeViewItem Header="Item3"/>

        <TreeView.Resources>
            <DataTemplate DataType="{x:Type TreeViewItem}" x:Key="selectedTemplate">
                <StackPanel Height="25">
                    <TextBlock Text="SelectedItem"/>
                </StackPanel>
            </DataTemplate>
        </TreeView.Resources>

        <TreeView.ItemContainerStyle>
            <Style TargetType="TreeViewItem">
                <Style.Triggers>
                    <Trigger Property="IsSelected" Value="True">
                        <Setter Property="FontWeight" Value="Bold"/>
                        <Setter Property="FontStyle" Value="Italic"/>
                        <Setter Property="Foreground" Value="Red"/>
                        <Setter Property="Background" Value="Green"/>
                        <Setter Property="ItemTemplate" Value="{StaticResource selectedTemplate}"/>
                    </Trigger>
                </Style.Triggers>
            </Style>
        </TreeView.ItemContainerStyle>
    </TreeView>

Итак, я выбрал TreeViewItem в древовидном представлении, FontWeight, FontStyle и Foreground изменены, но Background и ItemTemplate не изменились.

Результат: here

Не могли бы вы объяснить это странное поведение?

1 Ответ

5 голосов
/ 02 февраля 2012
Свойство

ItemTemplate влияет на дочерние элементы, а не на сам элемент.И фон установлен на фон выбора по умолчанию для Border, который украшает содержимое, поэтому зеленый цвет внизу не виден.Вы можете достичь своих целей следующим образом:

 <TreeView>
        <TreeViewItem Header="Item1" />
        <TreeViewItem Header="Item2" />
        <TreeViewItem Header="Item3"/>

        <TreeView.Resources>
            <ControlTemplate TargetType="{x:Type TreeViewItem}" x:Key="selectedTemplate">
                <StackPanel Height="25">
                    <TextBlock Text="SelectedItem" Background="{TemplateBinding Background}" />
                </StackPanel>
            </ControlTemplate>
        </TreeView.Resources>

        <TreeView.ItemContainerStyle>
            <Style TargetType="TreeViewItem">
                <Style.Triggers>
                    <Trigger Property="IsSelected" Value="True">
                        <Setter Property="FontWeight" Value="Bold"/>
                        <Setter Property="FontStyle" Value="Italic"/>
                        <Setter Property="Foreground" Value="Red"/>
                        <Setter Property="Background" Value="Green"/>
                        <Setter Property="Template" Value="{StaticResource selectedTemplate}"/>
                    </Trigger>
                </Style.Triggers>
            </Style>
        </TreeView.ItemContainerStyle>
    </TreeView>
...