2010-05-18 29 views
2

我使用HierarchicalDataTemplate在我的TreeView,我想也覆蓋了樹型視圖的默認模板,這樣,當一個項目被選中,這既突出了文字,不包括旁邊的圖標到它。樹型視圖 - 使用控件模板和HierarchicalDataTemplate一起

<TreeView.ItemTemplate> 
    <HierarchicalDataTemplate ItemsSource="{Binding Children}"> 
         <TreeViewItem Style="{StaticResource TreeViewItemStyle}" Header="{Binding DisplayText}" /> 

     </HierarchicalDataTemplate> 
</TreeView.ItemTemplate> 


      <TreeView.Resources> 
       <Style x:Key="TreeViewItemFocusVisual"> 
        <Setter Property="Control.Template"> 
         <Setter.Value> 
          <ControlTemplate> 
           <Rectangle/> 
          </ControlTemplate> 
         </Setter.Value> 
        </Setter> 
       </Style> 
       <Style x:Key="ExpandCollapseToggleStyle" TargetType="{x:Type ToggleButton}"> 
        <Setter Property="Focusable" Value="False"/> 
        <Setter Property="Width" Value="19"/> 
        <Setter Property="Height" Value="13"/> 
        <Setter Property="Template"> 
         <Setter.Value> 
          <ControlTemplate TargetType="{x:Type ToggleButton}"> 
           <Border Width="19" Height="13" Background="Transparent"> 
            <Border Width="9" Height="9" SnapsToDevicePixels="true" BorderBrush="#FF7898B5" BorderThickness="1" CornerRadius="1"> 
             <Border.Background> 
              <LinearGradientBrush EndPoint="1,1" StartPoint="0,0"> 
               <GradientStop Color="White" Offset=".2"/> 
               <GradientStop Color="#FFC0B7A6" Offset="1"/> 
              </LinearGradientBrush> 
             </Border.Background> 
             <Path x:Name="ExpandPath" Fill="Black" Margin="1,1,1,1" Data="M 0 2 L 0 3 L 2 3 L 2 5 L 3 5 L 3 3 L 5 3 L 5 2 L 3 2 L 3 0 L 2 0 L 2 2 Z"/> 
            </Border> 
           </Border> 
           <ControlTemplate.Triggers> 
            <Trigger Property="IsChecked" Value="True"> 
             <Setter Property="Data" TargetName="ExpandPath" Value="M 0 2 L 0 3 L 5 3 L 5 2 Z"/> 
            </Trigger> 
           </ControlTemplate.Triggers> 
          </ControlTemplate> 
         </Setter.Value> 
        </Setter> 
       </Style> 
       <Style x:Key="{x:Type TreeViewItem}" TargetType="{x:Type TreeViewItem}"> 
        <Setter Property="Background" Value="Transparent"/> 
        <Setter Property="HorizontalContentAlignment" Value="{Binding HorizontalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/> 
        <Setter Property="VerticalContentAlignment" Value="{Binding 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 Width="Auto"/> 
             <ColumnDefinition Width="Auto"/> 
             <ColumnDefinition Width="*"/> 
            </Grid.ColumnDefinitions> 
            <Grid.RowDefinitions> 
             <RowDefinition Height="Auto"/> 
             <RowDefinition/> 
            </Grid.RowDefinitions> 
            <ToggleButton x:Name="Expander" Style="{StaticResource ExpandCollapseToggleStyle}" ClickMode="Press" IsChecked="{Binding IsExpanded, RelativeSource={RelativeSource TemplatedParent}}"/> 
            <StackPanel Orientation="Horizontal" Grid.Column="1" > 
             <Image Width="16" Height="16" Margin="3,0" Source="{Binding Path=ImageSource}" /> 
             <Border x:Name="Bd" SnapsToDevicePixels="true" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Margin="0" Padding="0"> 
              <ContentPresenter x:Name="PART_Header" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" ContentSource="Header"/> 
             </Border> 
            </StackPanel> 
            <ItemsPresenter x:Name="ItemsHost" Grid.Column="1" Grid.ColumnSpan="2" Grid.Row="1"/> 
           </Grid> 
           <ControlTemplate.Triggers> 
            <Trigger Property="IsExpanded" Value="false"> 
             <Setter Property="Visibility" TargetName="ItemsHost" Value="Collapsed"/> 
            </Trigger> 
            <Trigger Property="HasItems" Value="false"> 
             <Setter Property="Visibility" TargetName="Expander" Value="Hidden"/> 
            </Trigger> 
            <Trigger Property="IsSelected" Value="true"> 
             <Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/> 
             <Setter Property="Control.Foreground" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}"/> 
            </Trigger> 
            <MultiTrigger> 
             <MultiTrigger.Conditions> 
              <Condition Property="IsSelected" Value="true"/> 
              <Condition Property="IsSelectionActive" Value="false"/> 
             </MultiTrigger.Conditions> 
             <Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/> 
             <Setter Property="Control.Foreground" TargetName="Bd" 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.Triggers> 
         <Trigger Property="VirtualizingStackPanel.IsVirtualizing" Value="true"> 
          <Setter Property="ItemsPanel"> 
           <Setter.Value> 
            <ItemsPanelTemplate> 
             <VirtualizingStackPanel/> 
            </ItemsPanelTemplate> 
           </Setter.Value> 
          </Setter> 
         </Trigger> 
        </Style.Triggers> 
       </Style> 
      </TreeView.Resources> 

我不能找到一種方法同時使用HierarchicalDataTemplate和控件模板在一起,所以可以指定的ItemsSource,改變它的控制行爲的部分。當我執行上面的代碼時,它根本不會選擇treeviewitem。

回答

4

而是具有HierarchicalDataTemplate的供應樹型視圖,你可以提供一個TextBlock。 TreeView會自動將TextBlock包裝在TreeViewItem容器中。現在你可以使用TreeView的ItemContainerStyle屬性的樣式自動適用於所有自動生成的TreeViewItems的。下面的代碼應該給你的總體思路(沒有全面檢查,所以告誡編碼器):

<TreeView ItemContainerStyle="{StaticResource TreeViewItemStyle}"> 
<TreeView.ItemTemplate> 
    <HierarchicalDataTemplate ItemsSource="{Binding Children}"> 
         <TextBlock Text="{Binding DisplayText}" /> 

     </HierarchicalDataTemplate> 
</TreeView.ItemTemplate> 


      <TreeView.Resources> 
       <Style x:Key="TreeViewItemFocusVisual"> 
        <Setter Property="Control.Template"> 
         <Setter.Value> 
          <ControlTemplate> 
           <Rectangle/> 
          </ControlTemplate> 
         </Setter.Value> 
        </Setter> 
       </Style> 
       <Style x:Key="ExpandCollapseToggleStyle" TargetType="{x:Type ToggleButton}"> 
        <Setter Property="Focusable" Value="False"/> 
        <Setter Property="Width" Value="19"/> 
        <Setter Property="Height" Value="13"/> 
        <Setter Property="Template"> 
         <Setter.Value> 
          <ControlTemplate TargetType="{x:Type ToggleButton}"> 
           <Border Width="19" Height="13" Background="Transparent"> 
            <Border Width="9" Height="9" SnapsToDevicePixels="true" BorderBrush="#FF7898B5" BorderThickness="1" CornerRadius="1"> 
             <Border.Background> 
              <LinearGradientBrush EndPoint="1,1" StartPoint="0,0"> 
               <GradientStop Color="White" Offset=".2"/> 
               <GradientStop Color="#FFC0B7A6" Offset="1"/> 
              </LinearGradientBrush> 
             </Border.Background> 
             <Path x:Name="ExpandPath" Fill="Black" Margin="1,1,1,1" Data="M 0 2 L 0 3 L 2 3 L 2 5 L 3 5 L 3 3 L 5 3 L 5 2 L 3 2 L 3 0 L 2 0 L 2 2 Z"/> 
            </Border> 
           </Border> 
           <ControlTemplate.Triggers> 
            <Trigger Property="IsChecked" Value="True"> 
             <Setter Property="Data" TargetName="ExpandPath" Value="M 0 2 L 0 3 L 5 3 L 5 2 Z"/> 
            </Trigger> 
           </ControlTemplate.Triggers> 
          </ControlTemplate> 
         </Setter.Value> 
        </Setter> 
       </Style> 
       <Style x:Key="{x:Type TreeViewItem}" TargetType="{x:Type TreeViewItem}"> 
        <Setter Property="Background" Value="Transparent"/> 
        <Setter Property="HorizontalContentAlignment" Value="{Binding HorizontalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/> 
        <Setter Property="VerticalContentAlignment" Value="{Binding 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 Width="Auto"/> 
             <ColumnDefinition Width="Auto"/> 
             <ColumnDefinition Width="*"/> 
            </Grid.ColumnDefinitions> 
            <Grid.RowDefinitions> 
             <RowDefinition Height="Auto"/> 
             <RowDefinition/> 
            </Grid.RowDefinitions> 
            <ToggleButton x:Name="Expander" Style="{StaticResource ExpandCollapseToggleStyle}" ClickMode="Press" IsChecked="{Binding IsExpanded, RelativeSource={RelativeSource TemplatedParent}}"/> 
            <StackPanel Orientation="Horizontal" Grid.Column="1" > 
             <Image Width="16" Height="16" Margin="3,0" Source="{Binding Path=ImageSource}" /> 
             <Border x:Name="Bd" SnapsToDevicePixels="true" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Margin="0" Padding="0"> 
              <ContentPresenter x:Name="PART_Header" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" ContentSource="Header"/> 
             </Border> 
            </StackPanel> 
            <ItemsPresenter x:Name="ItemsHost" Grid.Column="1" Grid.ColumnSpan="2" Grid.Row="1"/> 
           </Grid> 
           <ControlTemplate.Triggers> 
            <Trigger Property="IsExpanded" Value="false"> 
             <Setter Property="Visibility" TargetName="ItemsHost" Value="Collapsed"/> 
            </Trigger> 
            <Trigger Property="HasItems" Value="false"> 
             <Setter Property="Visibility" TargetName="Expander" Value="Hidden"/> 
            </Trigger> 
            <Trigger Property="IsSelected" Value="true"> 
             <Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/> 
             <Setter Property="Control.Foreground" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}"/> 
            </Trigger> 
            <MultiTrigger> 
             <MultiTrigger.Conditions> 
              <Condition Property="IsSelected" Value="true"/> 
              <Condition Property="IsSelectionActive" Value="false"/> 
             </MultiTrigger.Conditions> 
             <Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/> 
             <Setter Property="Control.Foreground" TargetName="Bd" 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.Triggers> 
         <Trigger Property="VirtualizingStackPanel.IsVirtualizing" Value="true"> 
          <Setter Property="ItemsPanel"> 
           <Setter.Value> 
            <ItemsPanelTemplate> 
             <VirtualizingStackPanel/> 
            </ItemsPanelTemplate> 
           </Setter.Value> 
          </Setter> 
         </Trigger> 
        </Style.Triggers> 
       </Style> 
      </TreeView.Resources> 

</TreeView>