2014-05-07 3 views
0

Si j'ai un TreeView qui utilise les contrôles ListBox comme TreeViewItems, comment puis-je obtenir le ListBoxItems pour couvrir l'ensemble du conteneur TreeView.WPF ListBox TreeViewItem pour remplir la largeur de TreeView

<Grid> 
    <TreeView> 
     <TreeViewItem Header="General 1"> 
      <ListBox BorderThickness="0"> 
       <ListBoxItem>Item A</ListBoxItem> 
       <ListBoxItem>Item B</ListBoxItem> 
       <ListBoxItem>Item C</ListBoxItem> 
      </ListBox> 
     </TreeViewItem> 
     <TreeViewItem Header="General 2"> 
      <ListBox BorderThickness="0"> 
       <ListBoxItem>Item A</ListBoxItem> 
       <ListBoxItem>Item B</ListBoxItem> 
       <ListBoxItem>Item C</ListBoxItem> 
      </ListBox> 
     </TreeViewItem> 
     <TreeViewItem Header="General 3"> 
      <ListBox BorderThickness="0"> 
       <ListBoxItem>Item A</ListBoxItem> 
       <ListBoxItem>Item B</ListBoxItem> 
       <ListBoxItem>Item C</ListBoxItem> 
      </ListBox> 
     </TreeViewItem> 
     <TreeViewItem Header="General 4"> 
      <ListBox BorderThickness="0"> 
       <ListBoxItem>Item A</ListBoxItem> 
       <ListBoxItem>Item B</ListBoxItem> 
       <ListBoxItem>Item C</ListBoxItem> 
      </ListBox> 
     </TreeViewItem> 
    </TreeView> 
</Grid> 

Ceci produit un résultat tel que l'image suivante. Notez que le ListBoxItem sélectionné ne s'étend pas sur la largeur du contrôle Treeview.

enter image description here

Répondre

1

Par défaut TreeViewItems se comportent de la même manière que ce que vous avez en ce moment si ListBox n'a rien à voir avec elle. TreeViewItem entoure simplement votre ListBox avec un ContentPresenter. Pour qu'il couvre l'élément sélectionné, le pinceau de surbrillance nécessiterait un travail supplémentaire.

Vous avez plusieurs options, vous pouvez modifier le Template pour le TreeViewItem

<ControlTemplate TargetType="{x:Type TreeViewItem}"> 
<StackPanel> 
    <Border Name="Bd" 
     Background="{TemplateBinding Background}" 
     BorderBrush="{TemplateBinding BorderBrush}" 
     BorderThickness="{TemplateBinding BorderThickness}" 
     Padding="{TemplateBinding Padding}"> 
     <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="19" /> 
      <ColumnDefinition /> 
     </Grid.ColumnDefinitions> 
       <ToggleButton x:Name="Expander" 
         Style="{StaticResource ExpandCollapseToggleStyle}" 
         IsChecked="{Binding Path=IsExpanded, 
            RelativeSource={RelativeSource TemplatedParent}}" 
         ClickMode="Press"/> 
       <ContentPresenter x:Name="PART_Header" 
        Grid.Column="1" 
         ContentSource="Header" 
         HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"/> 
     </Grid> 
    </Border> 
    <ItemsPresenter x:Name="ItemsHost" Margin="19,0,0,0" /> 
</StackPanel> 
<!-- Triggers --> 
</ControlTemplate> 

Le problème est qu'il ne s'étendra pas à la ToggleButton. Cela ne s'appliquera qu'au deuxième élément de la colonne. Où ExpandCollapseToggleStyle peut être extrait en accédant au modèle de contrôle réel.

L'autre solution où il s'étendra même avec le bouton bascule inclus utilise un convertisseur de longueur et une méthode d'extension TreeViewItem pour obtenir la profondeur. Les deux sont étroitement liés à l'arborescence visuelle TreeViewItem, donc si vous commencez à jouer avec les modèles, vous pouvez avoir des problèmes.

Définir un style

pleine TreeViewItem style

<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="{x:Type TreeViewItem}" 
    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}"> 
     <ControlTemplate.Resources> 
      <local:LeftMarginMultiplierConverter Length="19" x:Key="lengthConverter" /> 
     </ControlTemplate.Resources> 
     <StackPanel> 
     <Border Name="Bd" 
       Background="{TemplateBinding Background}" 
       BorderBrush="{TemplateBinding BorderBrush}" 
       BorderThickness="{TemplateBinding BorderThickness}" 
       Padding="{TemplateBinding Padding}"> 
      <Grid Margin="{Binding Converter={StaticResource lengthConverter}, 
           RelativeSource={RelativeSource TemplatedParent}}"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="19" /> 
       <ColumnDefinition /> 
      </Grid.ColumnDefinitions> 
      <ToggleButton x:Name="Expander" 
        Style="{StaticResource ExpandCollapseToggleStyle}" 
        IsChecked="{Binding Path=IsExpanded, 
           RelativeSource={RelativeSource TemplatedParent}}" 
        ClickMode="Press"/> 

      <ContentPresenter x:Name="PART_Header" 
      Grid.Column="1" 
         ContentSource="Header" 
         HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"/> 
      </Grid> 
      </Border> 
      <ItemsPresenter x:Name="ItemsHost" /> 
     </StackPanel> 
     <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="{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 TargetName="Bd" 
       Property="Background" 
       Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/> 
      <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> 

   <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="19" /> 
        <ColumnDefinition /> 
       </Grid.ColumnDefinitions> 
       <ToggleButton x:Name="Expander" 
        Style="{StaticResource ExpandCollapseToggleStyle}" 
        IsChecked="{Binding Path=IsExpanded, 
        RelativeSource={RelativeSource TemplatedParent}}" 
        ClickMode="Press"/> 

       <ContentPresenter x:Name="PART_Header" 
        Grid.Column="1" 
        ContentSource="Header" 
        HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"/> 
      </Grid> 
     </Border> 
     <ItemsPresenter x:Name="ItemsHost" /> 
    </StackPanel> 
    <!-- Triggers --> 
</ControlTemplate> 

TreeViewDepth Extension

public static class TreeViewItemExtensions 
{ 
    public static int GetDepth(this TreeViewItem item) 
    { 
     TreeViewItem parent; 
     while ((parent = GetParent(item)) != null) 
     { 
      return GetDepth(parent) + 1; 
     } 
     return 0; 
    } 

    private static TreeViewItem GetParent(TreeViewItem item) 
    { 
     var parent = VisualTreeHelper.GetParent(item); 
     while (!(parent is TreeViewItem || parent is TreeView)) 
     { 
      parent = VisualTreeHelper.GetParent(parent); 
     } 
     return parent as TreeViewItem; 
    } 
} 

LeftMarginMultiplierConverter

public class LeftMarginMultiplierConverter : IValueConverter 
{ 
    public double Length { get; set; } 

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     var item = value as TreeViewItem; 
     if (item == null) 
      return new Thickness(0); 

     return new Thickness(Length * item.GetDepth(), 0, 0, 0); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new System.NotImplementedException(); 
    } 
} 

contrôle

<TreeView Margin="50"> 

    <TreeViewItem Header="General 1"> 
     <ListBox BorderThickness="0"> 
      <ListBoxItem>Item A</ListBoxItem> 
      <ListBoxItem>Item B</ListBoxItem> 
      <ListBoxItem>Item C</ListBoxItem> 
     </ListBox> 
    </TreeViewItem> 
    <TreeViewItem Header="General 2"> 
     <ListBox BorderThickness="0"> 
      <ListBoxItem>Item A</ListBoxItem> 
      <ListBoxItem>Item B</ListBoxItem> 
      <ListBoxItem>Item C</ListBoxItem> 
     </ListBox> 
    </TreeViewItem> 
    <TreeViewItem Header="General 3"> 
     <ListBox BorderThickness="0"> 
      <ListBoxItem>Item A</ListBoxItem> 
      <ListBoxItem>Item B</ListBoxItem> 
      <ListBoxItem>Item C</ListBoxItem> 
     </ListBox> 
    </TreeViewItem> 
    <TreeViewItem Header="General 4"> 
     <ListBox BorderThickness="0"> 
      <ListBoxItem>Item A</ListBoxItem> 
      <ListBoxItem>Item B</ListBoxItem> 
      <ListBoxItem>Item C</ListBoxItem> 
     </ListBox> 
    </TreeViewItem> 
</TreeView> 
1

Essayez d'appliquer cette style à votre TreeView,

<Style TargetType="TreeViewItem"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="TreeViewItem"> 
        <StackPanel> 
         <VisualStateManager.VisualStateGroups> 
          <VisualStateGroup x:Name="ExpansionStates"> 
           <VisualState x:Name="Expanded"> 
            <Storyboard> 
             <ObjectAnimationUsingKeyFrames 
            Storyboard.TargetProperty="(UIElement.Visibility)" 
            Storyboard.TargetName="ItemsHost"> 
              <DiscreteObjectKeyFrame KeyTime="0" 
             Value="{x:Static Visibility.Visible}" /> 
             </ObjectAnimationUsingKeyFrames> 
            </Storyboard> 
           </VisualState> 
           <VisualState x:Name="Collapsed" /> 
          </VisualStateGroup> 
         </VisualStateManager.VisualStateGroups> 
         <ContentPresenter ContentSource="Header" /> 
         <ItemsPresenter Name="ItemsHost" Visibility="Collapsed" /> 
        </StackPanel> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
Questions connexes