Создание TreeView.ItemsPanel как холста - PullRequest
2 голосов
/ 29 февраля 2012

Я ищу способ отображения элементов TreeView на панели Canvas.

<TreeView>
    <TreeView.ItemsPanel>
        <ItemsPanelTemplate>
            <Canvas IsItemsHost="True"/>
        </ItemsPanelTemplate>
    </TreeView.ItemsPanel>
    <TreeViewItem Header="Root" IsExpanded="True" Canvas.Left="50" Canvas.Top="20">
        <TreeViewItem Header="Alpha" Canvas.Left="10" Canvas.Top="50">
            <TreeViewItem Header="Sub"/>
        </TreeViewItem>
        <TreeViewItem Header="Beta"/>
        <TreeViewItem Header="Gamma"/>
    </TreeViewItem>
</TreeView>

Это решение позволяет мне перемещаться по Root TreeViewItem, но я хочу, чтобы каждый элемент в TreeView соблюдал Canvas прикрепленных свойств. Я имею в виду, что когда Root {Left = 50, Top = 10} (здесь это работает) содержит Alpha {Left = 0, Top = 0}, Root будет в [50,10] и Alpha в [0,0 ] (абсолютные координаты Canvas).

Причина, по которой только Root TreeViewItem размещается правильно, заключается в том, что я использую TreeView.ItemsPanel. У меня есть чувство, что я должен использовать TreeView.ItemContainerStyle вместо этого, но я действительно не знаю, как.

Конечно, приветствуется любая помощь, желательно с включением HierarchicalDataTemplate, поэтому _ я знаю, как связать решение с Binding.

1 Ответ

3 голосов
/ 01 марта 2012

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

<Style TargetType="TreeViewItem">
    <Setter Property="ItemsPanel">
        <Setter.Value>
            <TreeViewItem.ItemsPanel>
                <ItemsPanelTemplate>
                    <Canvas />
                </ItemsPanelTemplate>
            </TreeViewItem.ItemsPanel>
        </Setter.Value>
    </Setter>
</Style>
...