WPF:TreeView - 按钮的条件放置以扩展子项

时间:2013-02-15 07:35:49

标签: wpf treeview datatemplate treeviewitem hierarchicaldatatemplate

我想构建一个具有以下功能的TreeView:

  1. 第一级应该有不在左侧但在右侧的扩展器按钮
  2. 所有子级别都应该在左侧有扩展按钮 - 就像默认的TreeViewItem一样
  3. 扩展/折叠应该像扩展控件一样动画
  4. 我正在使用DataTemplate和HierarchicalDataTemplate,但Expander-Button似乎不是模板的一部分,它总是添加到模板中并始终在左侧。 如何根据项目级别放置Expander-Button?

1 个答案:

答案 0 :(得分:1)

您必须通过更改ToggleButton列来自定义TreeViewItem ControlTemplate。然后,您可以使用样式中的DataTrigger更改controltemplate。

<Style x:Key="{x:Type TreeViewItem}" TargetType="{x:Type TreeViewItem}">
  <!-- snip -->
  <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 Grid.Column="1" x:Name="Expander"
              Style="{StaticResource ExpandCollapseToggleStyle}"
              IsChecked="{Binding Path=IsExpanded,
                          RelativeSource={RelativeSource TemplatedParent}}"
              ClickMode="Press"/>
      <Border Name="Bd"
          Grid.Column="0"
          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>
      <!-- snip -->
    </ControlTemplate.Triggers>
  </ControlTemplate>
</Style>