WPF TreeView с горизонтальной ориентацией?

Какой будет лучший способ изменить ориентацию древовидного представления WPF. Я хотел бы работать с функциональностью расширения, чтобы работать слева направо, а не сверху вниз. Т.е. когда я нажимаю на кнопку раскрытия триода, я бы хотел, чтобы его подузел отображался справа от родителя, а отступ должен работать сверху вниз. Также вертикальные линии, которые соединяют узел, теперь должны быть горизонтальными.

12.12.2008 20:40:15
2 ОТВЕТА
РЕШЕНИЕ

Вот отличная статья Джоша Смита о CodeProject, в которой подробно рассказывается, как делать подобные вещи.

6
12.12.2008 20:47:59

Чтобы раскрыть статью о CodeProject Джона Смита , если вы хотите, чтобы горизонтальное расположение было только на определенном уровне дерева (а не на всех уровнях, как показано в его статье), просто установите ItemsPanelсвойство на TreeViewItemуровне, который вы хотите иметь. StackPanel,

Сначала это не было интуитивно понятно, но вы можете получить это свойство через ItemContainerStyleсвойство HierarchicalDataTemplateдля слоя над слоем, который вы хотите расположить горизонтально.

Нравится:

<ItemsPanelTemplate
    x:Key="ItemsPanelForHorizontalItems">
    <StackPanel
        Orientation="Horizontal"/>
</ItemsPanelTemplate>

<HierarchicalDataTemplate
    x:Key="DataTemplateForLayerAboveHorizontalItems"
    DataType="{x:Type viewModel:ThingHavingHorizontalItems}"
    ItemsSource="{Binding HorizontalItems}"
    ItemTemplate="{StaticResource DataTemplateForLayerWithHorizontalItems}">
    <HierarchicalDataTemplate.ItemContainerStyle>
        <Style
            TargetType="TreeViewItem">
            <Setter
                Property="ItemsPanel"
                Value="{StaticResource ItemsPanelForHorizontalItems}"/>
        </Style>
    </HierarchicalDataTemplate.ItemContainerStyle>
    <ContentControl
        Content="{Binding}"
        ContentTemplate="{StaticResource DataTemplateForThingHavingHorizontalItems}"/>
</HierarchicalDataTemplate>

Следуя этой схеме, вы сможете установить горизонтальное расположение для любого отдельного слоя в вашем дереве, кроме корневого слоя. И если вы хотите, чтобы корневой слой был горизонтальным, просто установите ItemsPanelсвойство TreeViewдля использования горизонтального StackPanel.

2
17.03.2017 15:02:37
Я должен добавить, что расширение слоя с ориентацией, отличной от остальных, нарушает виртуализацию пользовательского интерфейса. Посмотрите на этот вопрос, если вы знаете, как это исправить
Matt Thomas 20.03.2017 18:37:54