#.net #wpf #treeview #wpf-controls
#.net #wpf #просмотр дерева #wpf-элементы управления
Вопрос:
Я пытаюсь установить закругленную границу вокруг выбранного элемента treeview (например, в проводнике Windows в Vista). Проблема в том, что триггер в следующем коде, похоже, не работает. Похоже, что свойство IsSelected всегда равно false.
<TreeView x:Name="m_treeView" BorderThickness="0" d:LayoutOverrides="Width, Height">
<TreeView.Resources>
<Style TargetType="TreeViewItem">
<Style.Resources>
<Brush x:Key="{x:Static SystemColors.HighlightBrushKey}">Transparent</Brush>
</Style.Resources>
</Style>
</TreeView.Resources>
<TreeView.ItemTemplate>
<HierarchicalDataTemplate DataType="{x:Type local:DirectoryPresentationBase}" ItemsSource="{Binding Children}">
<TreeViewItem>
<TreeViewItem.Header>
<Border Name="SelectedBorder" CornerRadius="3" Background="#EFF8FD" BorderBrush="#99DEFD"
BorderThickness="1" >
<StackPanel Orientation="Horizontal">
<interactivity:Interaction.Behaviors>
<local:TreeViewExpandBehavior AssociatedTreeView="{Binding ElementName=m_treeView}"/>
</interactivity:Interaction.Behaviors>
<Image x:Name="img" Width="24" Height="16" Stretch="None" Source="{Binding SmallIcon}"/>
<TextBlock Text="{Binding Name}" Margin="5,0" />
</StackPanel>
</Border>
</TreeViewItem.Header>
</TreeViewItem>
<HierarchicalDataTemplate.Triggers>
<Trigger Property="TreeViewItem.IsSelected" Value="True">
<Setter Property="Background" TargetName="SelectedBorder" Value="Red"/>
<Setter Property="BorderBrush" TargetName="SelectedBorder" Value="Green"/>
</Trigger>
<Trigger Property="TreeViewItem.IsSelected" Value="False">
<Setter Property="Background" TargetName="SelectedBorder" Value="Transparent"/>
<Setter Property="BorderBrush" TargetName="SelectedBorder" Value="Transparent"/>
</Trigger>
</HierarchicalDataTemplate.Triggers>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
Ответ №1:
Сначала удалите триггер IsSelected=False
. Он автоматически вернет все изменения, когда IsSelected
они станут not True
.
Во-вторых, переместить триггеры в TreeView.Resources
:
<TreeView.Resources>
<Style TargetType="TreeViewItem">
.....
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Background" Value="Red"/>
<Setter Property="BorderBrush" Value="Green"/>
</Trigger>
</Style.Triggers>
</Style>
</TreeView.Resources>
В-третьих, удалите TreeViewItem
тег. Используйте Border
непосредственно внутри HierarchicalDataTemplate
. Это потому, что все, что вы помещаете внутрь, HierarchicalDataTemplate
уже создано внутри some TreeViewItem
.
В-четвертых, привяжите фон границы и кисть границы к элементам treeviewitem
Background="{Binding Background, RelativeSource={RelativeSource AncestorType=TreeViewItem}}"
BorderBrush="{Binding BorderBrush, RelativeSource={RelativeSource AncestorType=TreeViewItem}}"
Комментарии:
1. Я не знаю, как избежать этой
SystemColors.HighlightBrushKey
настройки ресурса — это очень затрудняет настройку выделенного цвета на системный. Но пока вы используете только предопределенные цвета, все в порядке.