2014-10-01 109 views
0

我正在編寫一些維護對象層次結構的代碼,並且使用WPF TreeView來顯示層次結構的可視化表示並允許在對象上執行CRUD操作。WPF TreeViewItem樣式

在我的樹視圖中,我創建的按鈕可以觸發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的形式給出,但它不會做任何事情......(?)

<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

你需要一個樣式應用到包括觸發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>