我正在编写一些维护对象层次结构的代码,并使用WPF TreeView来显示层次结构的可视化表示,并允许对对象进行CRUD操作。
在我的树视图中,我创建了触发CRUD命令的按钮,但是为了减少视觉混乱,我只希望当用户将鼠标移动到树中的项目上时,特定项目的按钮可见。我想要做的是将treeviewitem的IsMouseOver属性连接到包含按钮的dockpanel的可见性。这可能吗?因为我搜索无果而且一无所获......
<HierarchicalDataTemplate x:Key="treeViewTemplate"
ItemsSource="{Binding Children}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="{Binding Name}"/>
<DockPanel Grid.Column="1">
<Button DockPanel.Dock="Right" Content="..."/>
<Button DockPanel.Dock="Right" Content="+"/>
<Button DockPanel.Dock="Right" Content="x"/>
</DockPanel>
</Grid>
</HierarchicalDataTemplate>`
我尝试了以下DataTrigger aproach,但它没有做任何事情......(?)
<HierarchicalDataTemplate x:Key="treeViewTemplate" ItemsSource="{Binding Children}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="{Binding Name}"/>
<DockPanel Grid.Column="1">
<DockPanel.Style>
<Style TargetType="{x:Type DockPanel}">
<Setter Property="Visibility" Value="Collapsed"/>
<Style.Triggers>
<DataTrigger Binding="{Binding IsMouseOver,
RelativeSource={RelativeSource AncestorType=TreeViewItem}}"
Value="True">
<Setter Property="Visibility" Value="Visible"/>
</DataTrigger>
</Style.Triggers>
</Style>
</DockPanel.Style>
<Button DockPanel.Dock="Right" Content="..."/>
<Button DockPanel.Dock="Right" Content="+"/>
<Button DockPanel.Dock="Right" Content="x"/>
</DockPanel>
</Grid>
</HierarchicalDataTemplate>
最后,经过多次浮躁和更多搜索之后,我有了一个树视图,可以满足我的需求。没有机会做到这一点,但这是标记:
<Window x:Class="WPFTest.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WPFTest"
Title="Window1" Height="300" Width="300">
<Window.Resources>
<!-- Data Template for TreeViewItems -->
<BooleanToVisibilityConverter x:Key="boolToVis"/>
<HierarchicalDataTemplate x:Key="treeViewTemplate" ItemsSource="{Binding Children}">
<Grid HorizontalAlignment="Stretch">
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="{Binding Name}" HorizontalAlignment="Left" Height="25" Margin="5" VerticalAlignment="Center"/>
</Grid>
</HierarchicalDataTemplate>
<!-- Style for the TreeViewItems -->
<SolidColorBrush x:Key="GlyphBrush" Color="#444" />
<Style x:Key="ExpandCollapseToggleStyle" TargetType="ToggleButton">
<Setter Property="Focusable" Value="False"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ToggleButton">
<Grid
Width="15"
Height="13"
Background="Transparent">
<Path x:Name="ExpandPath"
HorizontalAlignment="Left"
VerticalAlignment="Center"
Margin="1,1,1,1"
Fill="{StaticResource GlyphBrush}"
Data="M 4 0 L 8 4 L 4 8 Z"/>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsChecked"
Value="True">
<Setter Property="Data"
TargetName="ExpandPath"
Value="M 0 4 L 8 4 L 4 8 Z"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style x:Key="TreeViewItemFocusVisual">
<Setter Property="Control.Template">
<Setter.Value>
<ControlTemplate>
<Border>
<Rectangle Margin="0,0,0,0" StrokeThickness="5" Stroke="Black" StrokeDashArray="1 2" Opacity="0"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style x:Key="treeViewItemStyle"
TargetType="{x:Type TreeViewItem}">
<Setter Property="Background"
Value="Transparent"/>
<Setter Property="HorizontalContentAlignment"
Value="{Binding Path=HorizontalContentAlignment,
RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>
<Setter Property="VerticalContentAlignment"
Value="{Binding Path=VerticalContentAlignment,
RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>
<Setter Property="Padding"
Value="1,0,0,0"/>
<Setter Property="Foreground"
Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
<Setter Property="FocusVisualStyle"
Value="{StaticResource TreeViewItemFocusVisual}"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TreeViewItem}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition MinWidth="19" Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition/>
</Grid.RowDefinitions>
<ToggleButton x:Name="Expander" Style="{StaticResource ExpandCollapseToggleStyle}"
IsChecked="{Binding Path=IsExpanded,
RelativeSource={RelativeSource TemplatedParent}}"
ClickMode="Press"/>
<Grid Name="PART_ItemGrid" Grid.Column="1" HorizontalAlignment="Stretch" Background="Transparent">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<ContentPresenter Grid.Column="0" x:Name="PART_Header"
ContentSource="Header"
HorizontalAlignment="Stretch"/>
<DockPanel Grid.Column="1" x:Name="PART_DockPanel" Visibility="Hidden">
<Button Content="..." DockPanel.Dock="Right"
Visibility="{Binding Path=DataContext.CanEdit,
Converter={StaticResource boolToVis},
RelativeSource={RelativeSource TemplatedParent}}"/>
<Button Content="+" DockPanel.Dock="Right"
Visibility="{Binding Path=DataContext.CanAddChild,
Converter={StaticResource boolToVis},
RelativeSource={RelativeSource TemplatedParent}}"/>
<Button Content="x" DockPanel.Dock="Right"
Visibility="{Binding Path=DataContext.CanDelete,
Converter={StaticResource boolToVis},
RelativeSource={RelativeSource TemplatedParent}}"/>
</DockPanel>
</Grid>
<ItemsPresenter x:Name="ItemsHost" Grid.Row="1" Grid.Column="1" Grid.ColumnSpan="2"/>
</Grid>
<ControlTemplate.Triggers>
<Trigger SourceName="PART_ItemGrid" Property="IsMouseOver" Value="True">
<Setter TargetName="PART_DockPanel" Property="Visibility" Value="Visible"/>
</Trigger>
<Trigger Property="IsExpanded" Value="false">
<Setter TargetName="ItemsHost" Property="Visibility" Value="Collapsed"/>
</Trigger>
<Trigger Property="HasItems" Value="false">
<Setter TargetName="Expander" Property="Visibility" Value="Hidden"/>
</Trigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="HasHeader" Value="false"/>
<Condition Property="Width" Value="Auto"/>
</MultiTrigger.Conditions>
<Setter TargetName="PART_Header" Property="MinWidth" Value="75"/>
</MultiTrigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="HasHeader" Value="false"/>
<Condition Property="Height" Value="Auto"/>
</MultiTrigger.Conditions>
<Setter TargetName="PART_Header" Property="MinHeight" Value="19"/>
</MultiTrigger>
<!--<Trigger Property="IsSelected" Value="true">
<Setter TargetName="Bd" Property="Background" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}"/>
</Trigger>-->
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsSelected" Value="true"/>
<Condition Property="IsSelectionActive" Value="false"/>
</MultiTrigger.Conditions>
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
</MultiTrigger>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
<!-- Navigation Tree -->
<Grid>
<TreeView ItemsSource="{Binding FirstGeneration}" ItemTemplate="{StaticResource treeViewTemplate}" HorizontalAlignment="Stretch"
ItemContainerStyle="{StaticResource treeViewItemStyle}"/>
</Grid>
谢谢, 克里斯
答案 0 :(得分:0)
您需要将样式应用于包含触发器的DockPanel。
例如,
<DockPanel Grid.Column="1" Visibility="Hidden">
<DockPanel.Style>
<Style TargetType="{x:Type DockPanel}">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Visibility" Value="Visible"/>
</Trigger>
</Style.Triggers>
</Style>
</DockPanel.Style>