1

Я хотел бы построить TreeView со следующими характеристиками:WPF: TreeView - условное размещение кнопки для расширения подразделов

  1. Первый уровень должен иметь кнопку разворачивания не на левой, а на правой стороне
  2. всех подуровни должны иметь расширительную кнопку слева - так же, как по умолчанию TreeViewItem
  3. расширяющий/Свертывание должно быть анимированным так же, как детандер-контроль

Я был тезами петь вокруг с DataTemplate и HierarchicalDataTemplate, но кнопка Expander не кажется частью шаблона, она всегда добавляется к шаблону и всегда слева. Как разместить кнопку Expander в зависимости от уровня элемента?

ответ

1

Вы должны настроить TreeViewItem ControlTemplate, изменив столбец ToggleButton. Затем вы можете просто изменить контрольную таблицу с помощью DataTrigger внутри стиля.

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

Thanks. Вот как я попробовал. Но проблема в том, что на подэлементах (те, что идут в ItemsPresenter), у них тоже есть кнопка расширения справа ... – user1130329

+0

Просто установите шаблон внутри datatrigger, привязанный к свойству уровня вашего объекта – mathieu

+0

Вы имеете в виду I должен переключить CONTROLtemplate внутри datatrigger? – user1130329