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

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


person bitbonk    schedule 12.12.2008    source источник


Ответы (2)


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

person Micah    schedule 12.12.2008

Чтобы развернуть статью Джона Смита 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.

person Matt Thomas    schedule 17.03.2017
comment
Я должен добавить, что расширение слоя с ориентацией, отличной от остальных, нарушает виртуализацию пользовательского интерфейса. См. этот вопрос, если вы знаете, как это исправить. - person Matt Thomas; 20.03.2017