Выделите TextBlock только в TreeViewItem с изображением - PullRequest
1 голос
/ 09 ноября 2009

Итак, у меня есть TreeViewItem, который имеет следующий стиль:

                   <Style TargetType="{x:Type TreeViewItem}">
                        <Setter Property="HeaderTemplate">
                            <Setter.Value>
                                <DataTemplate>
                                    <StackPanel Orientation="Horizontal">
                                        <Image Name="img" Width="20" Height="16" Stretch="Uniform" Source="Images/Folder.png"/>
                                        <TextBlock Text="{Binding}" Margin="5,0" />
                                    </StackPanel>
                                </DataTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>

При выборе текстовый блок И изображение выделяются. Я пытаюсь просто выделить TextBlock, чтобы он функционировал как дерево папок в проводнике.

Ответы [ 2 ]

1 голос
/ 23 октября 2011

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

В моем TreeView я перезаписываю две кисти, используемые для установки фона TreeViewItem, когда меняется его выбор. Я также создаю копии кистей, чтобы потом восстановить их в своем шаблоне данных:

<TreeView ItemsSource="{Binding Path=SomeDataSource}">
    <TreeView.Resources>
         <SolidColorBrush x:Key="_CustomHighlightBrushKey" Color="{Binding Source={StaticResource {x:Static SystemColors.HighlightBrushKey}}, Path=Color}" />
         <SolidColorBrush x:Key="_CustomControlBrushKey" Color="{Binding Source={StaticResource {x:Static SystemColors.ControlBrushKey}}, Path=Color}" />
         <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Transparent" />
         <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Transparent" />
    </TreeView.Resources>
</TreeView>

Обратите внимание, что я не смог заставить это работать с привязкой DynamicResource, поэтому это решение, вероятно, не будет работать с изменениями темы. Мне было бы очень интересно узнать, есть ли способ сделать это.

Затем я использую следующий шаблон иерархических данных для форматирования узлов дерева:

<HierarchicalDataTemplate DataType="{x:Type SomeViewModelType}" ItemsSource="{Binding Path=Children}">
    <StackPanel Orientation="Horizontal">
        <StackPanel.Resources>
            <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="{Binding Source={StaticResource {x:Static SystemColors.HighlightBrushKey}}, Path=Color}" />
            <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="{Binding Source={StaticResource {x:Static SystemColors.ControlBrushKey}}, Path=Color}" />
        </StackPanel.Resources>
        <Image SnapsToDevicePixels="True" Source="...">
        </Image>
        <TextBlock Text="{Binding Path=DisplayName}" Margin="5,0">
            <TextBlock.Resources>
                <Style TargetType="{x:Type TextBlock}">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type TreeViewItem}}, Path=IsSelected}" Value="True">
                            <Setter Property="Background" Value="{DynamicResource _CustomHighlightBrushKey}" />
                        </DataTrigger>
                        <MultiDataTrigger>
                            <MultiDataTrigger.Conditions>
                                <Condition Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type TreeViewItem}}, Path=IsSelected}" Value="True" />
                                <Condition Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type TreeViewItem}}, Path=IsSelectionActive}" Value="False" />
                            </MultiDataTrigger.Conditions>
                            <Setter Property="Background" Value="{DynamicResource _CustomControlBrushKey}" />
                        </MultiDataTrigger>
                    </Style.Triggers>
                </Style>
            </TextBlock.Resources>
        </TextBlock>
    </StackPanel>
</HierarchicalDataTemplate>

Обратите внимание, что я возвращаю системным кистям их исходные (статические) значения, чтобы контекстные меню могли отображаться правильно.

0 голосов
/ 10 ноября 2009

Вам нужно будет свернуть свою собственную выделенную метку вверх, поэтому вместо того, чтобы элемент управления закрашивал весь фон панели синим цветом, вы устанавливаете собственное форматирование подсветки на основе триггера, когда TreeViewItem.IsSelected равно True.

В вашем случае это будет установка фона контейнера текста на синий (если он установлен, обычно белый) и оставление фона контейнера изображения белым, в то время как общий фон контейнера будет белым.

Метод описан здесь: текст ссылки

...