C# WPF树视图项目样式

C# WPF树视图项目样式,c#,wpf,treeview,C#,Wpf,Treeview,我正在编写一些代码来维护对象的继承权,并使用WPF树视图来显示继承权的可视化表示,以及允许对对象执行CRUD操作 在我的treeview中,我创建了触发CRUD命令的按钮,但是为了减少视觉混乱,我只希望当用户将鼠标移动到树中某个项目上时,该项目的按钮可见。我想做的是将treeviewitem的IsMouseOver属性连接到包含按钮的dockpanel的可见性。这可能吗?因为我找不到任何东西 <HierarchicalDataTemplate x:Key="treeViewTemplate

我正在编写一些代码来维护对象的继承权,并使用WPF树视图来显示继承权的可视化表示,以及允许对对象执行CRUD操作

在我的treeview中,我创建了触发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,但它没有任何作用。。。(?)


最后,在经历了大量的浮躁和更多的搜索之后,我有了一个树视图,它可以实现我想要的。我还没有机会把它弄得乱七八糟,但这里有一个标记:

<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>

谢谢,
Chris

您需要将包含触发器的样式应用于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>

<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>