2010-03-23 7 views

Répondre

0

Vous pouvez modifier l'en-tête de votre TreeViewItem pour ajouter une case à cocher à gauche. Voici un exemple rapide pour vous aider à démarrer, ce xaml ajoute simplement une case à cocher à gauche et un TextBlock à droite.

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

En fonction de votre scénario, vous pouvez créer un nouveau modèle entier pour remplacer l'apparence par défaut pour tous les TreeViewItems, si vous le faites, alors checkout l'exemple modèle de contrôle MSDN TreeViewItem:

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

+0

Merci pour votre réponse. Je veux dire une situation comme celle-ci: ----------------------------- | TreeView Column1 Colonne2 CheckBox TreeViewItem CheckBox TreeViewItem CheckBox TreeViewItem Toutes les cases doivent être alignement sur la gauche, TreeView sur le côté droit. Withou utilisant LisBox ou TreeListView –

+0

Lorsque je l'utilise http://msdn.microsoft.com/en-us/library/ms788727.aspx Je suis situation lorsque case à cocher sur le côté gauche, mais pas d'alignement dans la colonne. –

+0

Ce que vous voulez, c'est que toutes les cases à cocher soient alignées l'une en dessous de l'autre à gauche, quelle que soit la profondeur d'imbrication de TreeViewItem. Je suis presque certain que c'est faisable en utilisant le ControlTemplate, mais ça fait un moment que je l'ai étudié. Je vais voir si je peux le trouver et poster du code. –

1

Sergo, Voici une version utilisant le modèle de contrôle et nous avons placé des cases à cocher dans la colonne 0 de l'article. Ils doivent s'aligner à gauche avec le TreeViewItem à droite. La pièce 'magic' est dans le style CheckboxTreeItem où nous ajoutons un WrapPanel et le placons dans 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

Merci beaucoup par exemple. Vous comprenez ce que je veux dire. Maintenant, nous avons l'élément racine Header = 'Item' et près de case à cocher - c'est bon, mais l'article suivant Header = 'SubItem 1' a offset - c'est ok aussi. Mais la case à cocher de Header = 'SubItem 1' doit rester sous la case à cocher root, elle n'a pas de décalage. –

+0

Pourriez-vous me donner une version révisée? –

+0

Si vous voulez que les TreeViewItems soient en retrait, mais que toutes les cases à cocher soient à gauche (quel que soit leur retrait), vous devrez peut-être ajouter un moyen de connaître votre niveau d'imbrication. Je ne suis pas sûr de la façon d'accomplir cela dans Xaml seul. –

Questions connexes