【问题标题】:WPF Add indentation before TreeViewItem template [duplicate]WPF在TreeViewItem模板之前添加缩进[重复]
【发布时间】:2020-07-16 19:06:50
【问题描述】:

我正在开发一个 WPF 应用程序,但我正在努力使用 TreeView。我想在 Windows 资源管理器中实现外观。

默认的 TreeView 样式仅将 TreeViewItem 拉伸到所需的空间。

我已经覆盖了默认模板来实现这种外观,但我真的不知道如何在子项的左侧添加空间。

我的代码:

<ControlTemplate TargetType="{x:Type TreeViewItem}">
   <Grid>
      <Grid.ColumnDefinitions>
         <ColumnDefinition Width="*"/>
      </Grid.ColumnDefinitions>
      <Grid.RowDefinitions>
         <RowDefinition Height="Auto"/>
         <RowDefinition/>
      </Grid.RowDefinitions>
      <Border x:Name="Bd" Grid.Column="0" HorizontalAlignment="Stretch" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true">
         <Grid>
            <Grid.ColumnDefinitions>
               <ColumnDefinition MinWidth="19" Width="Auto"/>
               <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
               <RowDefinition Height="Auto"/>
               <RowDefinition/>
            </Grid.RowDefinitions>
            <ContentPresenter x:Name="PART_Header" Grid.Column="1" ContentSource="Header" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
            <ToggleButton x:Name="Expander" Grid.Column="0" ClickMode="Press" IsChecked="{Binding IsExpanded, RelativeSource={RelativeSource TemplatedParent}}" Style="{StaticResource ExpandCollapseToggleStyle}"/>
         </Grid>
      </Border>
      <ItemsPresenter x:Name="ItemsHost" Grid.Row="1" Grid.Column="1" />
   </Grid>

【问题讨论】:

  • 您忘记将&lt;ColumnDefinition Width="INDENTATION"/&gt; 添加到第一个网格中,因此带有 Grid.Column="1" 的 ItemsPresenter 将放在第一列中

标签: wpf xaml treeview treeviewitem


【解决方案1】:

您的Style 有一些缺陷。
您缺少一列(这就是项目位于标题下方的原因)。您的ItemsPresenter 始终可见。它应该被折叠并只有在按下扩展器时才可见。您缺少相应的触发器。您还需要隐藏没有子项的扩展器。

这就是基本的Style 的样子。
要更改索引,只需将Margin 添加到ItemPresenter

<Style TargetType="TreeViewItem">
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="{x:Type TreeViewItem}">
        <Grid SnapsToDevicePixels="true">
          <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="*" />
          </Grid.ColumnDefinitions>
          <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition />
          </Grid.RowDefinitions>

          <ToggleButton x:Name="Expander" 
                        Grid.Column="0" Grid.Row="0"
                        ClickMode="Press"
                        IsChecked="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=IsExpanded}"
                        Style="{StaticResource ExpandCollapseToggleStyle}" />
          <Border x:Name="Bd" 
                  Grid.Column="1" Grid.Row="0"
                  BorderBrush="{TemplateBinding BorderBrush}"
                  BorderThickness="{TemplateBinding BorderThickness}"
                  Background="{TemplateBinding Background}"
                  Padding="{TemplateBinding Padding}">

            <ContentPresenter x:Name="PART_Header"
                              ContentSource="Header"
                              HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" />
          </Border>

          <ItemsPresenter x:Name="ItemsHost" 
                          Grid.Row="1" Grid.Column="1"
                          Visibility="Collapsed" />
        </Grid>
        <ControlTemplate.Triggers>
          <Trigger Property="HasItems"
                   Value="false">
            <Setter TargetName="Expander"
                    Property="Visibility"
                    Value="Hidden" />
          </Trigger>
          <Trigger Property="IsExpanded"
                   Value="True">
            <Setter TargetName="ItemsHost"
                    Property="Visibility"
                    Value="Visible" />
          </Trigger>
          <Trigger Property="IsSelected"
                   Value="True">
            <Setter Property="Background"
                    Value="CornflowerBlue" />
        </ControlTemplate.Triggers>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>

【讨论】:

  • 但是该项目并没有像有问题的 Windows 资源管理器那样扩展到完整的父 length
  • 什么意思?这些项目将拉伸以占用可用的水平空间。如何设置选中项背景?
  • 我已经添加了一个对应的IsSelected触发器来设置选中项的背景。使用上面的代码,项目确实可以按预期拉伸。
猜你喜欢
  • 1970-01-01
  • 2016-02-05
  • 2011-10-21
  • 2013-09-13
  • 1970-01-01
  • 1970-01-01
  • 2021-12-22
  • 1970-01-01
  • 2017-02-14
相关资源
最近更新 更多