使TreeView.ItemsPanel成为一个画布

时间:2012-02-29 17:38:02

标签: wpf treeview wpf-controls wpf-positioning

我正在寻找一种在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 个答案:

答案 0 :(得分:3)

TreeViewItems布置自己的孩子,他们每个人都有自己的面板,因此您需要更改TreeView上的画布和项目。要执行此操作,请应用通过资源或ItemContainerStyle隐式更改面板的样式。

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