2012-02-29 33 views
1

我正在尋找一種方法在Canvas面板中使我的TreeView顯示項目。使TreeView.ItemsPanel成爲畫布

<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在[0,0 ](座標絕對爲Canvas)。

之所以爲什麼只有根號TreeViewItem自己放置正確的是,我使用TreeView.ItemsPanel。我有一種感覺,我應該用TreeView.ItemContainerStyle來代替,但我真的不知道如何。

當然,任何幫助表示讚賞,最好也納入HierarchicalDataTemplate太_I知道如何連接解決方​​案與Binding

+0

是否有什麼特別的原因,你使用'TreeView'而不是'ItemsControl'? – Rachel 2012-02-29 20:04:48

+0

是的,我想使用'HierarchicalDataTemplate',並且從我在互聯網上發現的東西,它只使用'TreeView'。但是如果有一種方法可以使用它,我會很樂意使用ItemsControl。 – 2012-02-29 20:26:22

+0

您的TreeView中的數據對象是否都是同一類型?如果是這樣,你可以使用一個隱式'DataTemplate'而不是'HierarchicalDataTemplate'。 – Rachel 2012-02-29 20:28:22

回答

3

TreeViewItems擺出自己的孩子,他們每個人都有自己的面板,所以你需要改變TreeView和物品上的畫布。要做到這一點,應用一種改變面板的樣式,或者隱式地通過資源或ItemContainerStyle

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