2012-11-30 12 views
7

Mój widok drzewa ma w zasadzie węzły "folder" i jeden poziom poniżej elementów, które NIE zawierają innych elementów.Widok drzewa WPF, zmiana wcięcia

Tam, gdzie miejsce na ikony rozwijania/zwijania nie jest wymagane (na poziomie 2). Czy mogę zrezygnować z tej przestrzeni ikon, a tym samym zmniejszyć wcięcie. Pozycje (w przykładzie "lotniska") przesuwa się o kilka pikseli w lewo.

Example tree view

Ważne: W zasadzie patrząc na rozwiązanie kodu (C#), a nie w wersji XAML.

Odpowiedz

10

Naprawdę chcesz edytować plik HierarchicalDataTemplate i zmienić jego zachowanie. Następująca strona ma całkiem niezły widok wysokiego poziomu edycji Hierarchical Data Template.

Znalazłem również this one, aby być całkiem dobrym na początek. Chociaż żadna ze stron nie mówi wyraźnie, co należy zrobić, zasadniczo zmienia właściwości układu w podglądzie elementów.

Edytuj

Ups, byłem niepoprawny. Nie HierarchicalDataTemplate, ale szablon TreeViewItem.

Zobacz poniżej przykład. To jest najprostszy sposób, aby to zrobić, jeśli wiesz, że nie będzie żadnych węzłów trzeciego poziomu.

Zwróć szczególną uwagę na element ItemsPresenter o nazwie ItemsHost. Ma margines -12,0,0,0. Oznacza to, że jego lewy margines jest ujemny, a zatem rozlewa się z kolumny siatki zawierającej go w lewym kierunku. W ten sposób wszystkie węzły potomne będą nieco przesunięte w lewo. Jeśli masz węzły trzeciego poziomu w przyszłości, zostaną one również przeciągnięte w lewo. Jeśli tego nie chcesz, będziesz musiał dostarczyć różne szablony dla różnych poziomów węzłów. Ale to wykracza poza zakres tej odpowiedzi.

<Style x:Key="TreeViewItemStyle1" TargetType="{x:Type TreeViewItem}"> 
    <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> 
        <ToggleButton x:Name="Expander" ClickMode="Press" IsChecked="{Binding IsExpanded, RelativeSource={RelativeSource TemplatedParent}}" Style="{StaticResource ExpandCollapseToggleStyle}"/> 
        <Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Grid.Column="1" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true"> 
         <ContentPresenter x:Name="PART_Header" ContentSource="Header" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/> 
        </Border> 
        <ItemsPresenter x:Name="ItemsHost" Grid.ColumnSpan="2" Grid.Column="1" Grid.Row="1" Margin="-12,0,0,0"/> 
       </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="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="Background" TargetName="Bd" 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.Triggers> 
     <Trigger Property="VirtualizingStackPanel.IsVirtualizing" Value="true"> 
      <Setter Property="ItemsPanel"> 
       <Setter.Value> 
        <ItemsPanelTemplate> 
         <VirtualizingStackPanel/> 
        </ItemsPanelTemplate> 
       </Setter.Value> 
      </Setter> 
     </Trigger> 
    </Style.Triggers> 
</Style>