2010-03-23 64 views

回答

0

您可以修改TreeViewItem的标题以在左侧添加复选框。下面是一个快速入门的例子,这个xaml只是在左侧添加了一个复选框,在右侧添加了一个TextBlock。

<TreeView> 
     <TreeViewItem> 
      <TreeViewItem.Header> 
       <WrapPanel> 
        <CheckBox /> 
        <TextBlock 
         Margin='5,0' 
         Text='Item' /> 
       </WrapPanel> 
      </TreeViewItem.Header> 
      <TreeViewItem> 
       <TreeViewItem.Header> 
        <WrapPanel> 
         <CheckBox /> 
         <TextBlock 
          Margin='5,0' 
          Text='SubItem' /> 
        </WrapPanel> 
       </TreeViewItem.Header> 
      </TreeViewItem> 
     </TreeViewItem> 
    </TreeView> 

根据你的情况下,您可能希望创建一个全新的模板来覆盖默认的外观为所有TreeViewItems,如果你这样做,然后签出MSDN树型视图控件模板例如:

http://msdn.microsoft.com/en-us/library/ms788727.aspx

+0

感谢您的回复。 我的意思是这样的情况: ----------------------------- | 的TreeView 列1列2 的CheckBox树型视图 的CheckBox树型视图 的CheckBox树型视图 所有复选框必须在右侧的左对齐,树视图。 Withou使用LisBox或TreeListView – 2010-03-23 11:58:30

+0

当我使用这个http://msdn.microsoft.com/en-us/library/ms788727.aspx 我有情况左边的复选框,但没有对齐列。 – 2010-03-23 13:36:03

+0

无论TreeViewItem的嵌套深度如何,您希望所有复选框都沿着左边的对齐方式排列在彼此之下。我几乎可以肯定这是使用ControlTemplate可以实现的,但是我已经仔细研究了一段时间。我会看看我能否找到它并发布一些代码。 – 2010-03-23 13:57:34

1

Sergo,这是一个使用控制模板的版本,我们在项目的第0列中放置了复选框。它们应该与TreeViewItem向左对齐。 '魔术'部分在CheckboxTreeItem样式中,我们添加一个WrapPanel并将其放置在Grid.Column ='0'中。

<Window 
    x:Class="TreeViewHeaderTest.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" 
    Height="300" 
    Width="300"> 
    <Window.Resources> 
     <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"> 
         <WrapPanel 
          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" /> 
         </WrapPanel> 
         <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="CheckboxTreeItem" 
      TargetType="{x:Type TreeViewItem}"> 
      <Setter 
       Property="IsExpanded" 
       Value="{Binding IsExpanded, Mode=TwoWay}" /> 
      <Setter 
       Property="IsSelected" 
       Value="{Binding IsSelected, Mode=TwoWay}" /> 
      <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="{StaticResource {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="Auto" /> 
           <ColumnDefinition 
            Width="*" /> 
          </Grid.ColumnDefinitions> 
          <Grid.RowDefinitions> 
           <RowDefinition 
            Height="Auto" /> 
           <RowDefinition /> 
          </Grid.RowDefinitions> 
          <WrapPanel 
           Grid.Column='0'> 
           <CheckBox /> 
           <ToggleButton 
            x:Name="Expander" 
            Style="{StaticResource 
            ExpandCollapseToggleStyle}" 
            IsChecked="{Binding Path=IsExpanded, 
             RelativeSource={RelativeSource 
            TemplatedParent}}" 
            ClickMode="Press" /> 
          </WrapPanel> 
          <Border 
           Name="Bd" 
           Grid.Column="1" 
           Background="{TemplateBinding Background}" 
           BorderBrush="{TemplateBinding BorderBrush}" 
           BorderThickness="{TemplateBinding 
           BorderThickness}" 
           Padding="{TemplateBinding Padding}"> 
           <ContentPresenter 
            x:Name="PART_Header" 
            ContentSource="Header" 
            HorizontalAlignment="{TemplateBinding 
            HorizontalContentAlignment}" /> 
          </Border> 
          <ItemsPresenter 
           x:Name="ItemsHost" 
           Grid.Row="1" 
           Grid.Column="1" 
           Grid.ColumnSpan="2" /> 
         </Grid> 
         <ControlTemplate.Triggers> 
          <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="AliceBlue" /> 
          </Trigger> 
          <MultiTrigger> 
           <MultiTrigger.Conditions> 
            <Condition 
             Property="IsSelected" 
             Value="true" /> 
            <Condition 
             Property="IsSelectionActive" 
             Value="false" /> 
           </MultiTrigger.Conditions> 
           <Setter 
            TargetName="Bd" 
            Property="Background" 
            Value="{StaticResource {x:Static 
            SystemColors.ControlBrushKey}}" /> 
           <Setter 
            Property="Foreground" 
            Value="{StaticResource {x:Static 
            SystemColors.ControlTextBrushKey}}" /> 
          </MultiTrigger> 
          <Trigger 
           Property="IsEnabled" 
           Value="false"> 
           <Setter 
            Property="Foreground" 
            Value="{StaticResource {x:Static 
            SystemColors.GrayTextBrushKey}}" /> 
          </Trigger> 
         </ControlTemplate.Triggers> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </Window.Resources> 
    <TreeView> 
     <TreeViewItem 
      Style='{StaticResource CheckboxTreeItem}' 
      Header='Item' 
      IsExpanded='True'> 
      <TreeViewItem 
       Style='{StaticResource CheckboxTreeItem}' 
       Header='SubItem 1' /> 
      <TreeViewItem 
       Style='{StaticResource CheckboxTreeItem}' 
       Header='SubItem 2'> 
       <TreeViewItem 
        Style='{StaticResource CheckboxTreeItem}' 
        Header='SubItem a' /> 
       <TreeViewItem 
        Style='{StaticResource CheckboxTreeItem}' 
        Header='SubItem b' /> 
      </TreeViewItem> 
     </TreeViewItem> 
    </TreeView> 
</Window> 
+0

非常感谢,例如。你明白我的意思。现在我们有根元素Header ='Item' 并且在复选框附近 - 这很好,但是下一个项目Header ='SubItem 1'有偏移量 - 也没关系。但是Header ='SubItem 1'的复选框必须保持在复选框的根目录下,而不是偏移量。 – 2010-03-23 14:50:57

+0

你可以给我修改版吗? – 2010-03-23 15:30:17

+0

如果你想TreeViewItems缩进,但所有的复选框都会左移(不管它们的缩进),那么你可能需要添加一些方法来知道你的嵌套层次。我不确定如何在Xaml中完成这项工作。 – 2010-03-23 15:31:34