2012-02-29 8 views
1

Я ищу способ сделать свои TreeView элементы отображения в панели Canvas.Создание TreeView.ItemsPanel a 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> 

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

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

Любая помощь, конечно, приветствуется, предпочтительно, включая HierarchicalDataTemplate. _I знаю, как подключить решение с помощью Binding.

+0

Есть ли какая-то особая причина, по которой вы используете 'TreeView' вместо' ItemsControl'? – Rachel

+0

Да, я хочу использовать 'HierarchicalDataTemplate' и из того, что я нашел в Интернете, он работает только с TreeView. Но я с удовольствием поеду с 'ItemsControl', если есть способ сделать эту работу с ним. –

+0

Являются ли объекты данных в вашем TreeView одинаковыми? Если они есть, вы можете использовать неявный 'DataTemplate' вместо' HierarchicalDataTemplate'. – Rachel

ответ

3

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

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