2011-12-19 111 views
2

我想添加一個樹視圖內的內容控件,但是當我在內容控件中添加樹視圖項時,它們遠離其他樹視圖項。ContentControl內WPF TreeView

<TreeView> 
    <TreeViewItem Header="XXX-1"></TreeViewItem> 
    <TreeViewItem Header="XXX-2"></TreeViewItem> 
    <ContentControl> 
     <TreeViewItem Header="YYY-1"></TreeViewItem> 
    </ContentControl>    
    <TreeViewItem Header="XXX-3"></TreeViewItem> 
</TreeView> 

上面的代碼導致如下所示的treeview。

 
XXX-1 
XXX-2 
    YYY-1 
XXX-3 

我認爲ContentControl本身添加了另一個TreeViewItem。我如何將TreeViewItem對齊在一起?

+1

將TreeViewItem添加到ContentControl的目標是什麼? – Josh 2011-12-19 14:32:38

+0

@Josh:請參閱我寫給Orchestrator的評論。 – exoz 2011-12-19 19:43:57

+0

下面的答案應該適合你。 – Josh 2011-12-19 20:00:59

回答

2

我會從Rachel的回答開始,但刪除ContentControl。您可以使用兩個DataTemplates和一個分配給TreeViewItem的ItemTemplateSelector屬性的ItemTemplateSelector來完成此操作。

將您的複雜和簡單類型定義爲兩個DataTemplates。然後編寫一個從DataTemplateSelector繼承的類,該類確定是否應該在TreeViewItem中使用複雜類型或簡單類型。然後將TreeViewItem的ItemTemplateSelector設置爲剛創建的DataTemplateSelector對象。這裏是一個例子:http://msdn.microsoft.com/en-us/library/system.windows.controls.itemscontrol.itemtemplateselector.aspx

下面是另一個鏈接,顯示如何根據條件選擇DataTemplate:http://msdn.microsoft.com/en-us/library/ms742521.aspx。搜索標題根據數據對象的屬性選擇DataTemplate

0

它做窩的ContentControl中的樹型視圖(見下文Snoop截圖)

史努比還告訴我,額外的保證金爲+/-擴展,所以你可能要改寫模板來獲得如果你想保持你的TreeViewItems嵌套,擺脫那個邊緣。

enter image description here

當然,如果你只是想將您的樹型視圖內ContentControl中,標籤應該是周圍的其他方法。

<TreeViewItem Header="YYY-1"> 
    <ContentControl /> 
</TreeViewItem> 
+0

覆蓋模板是什麼意思?是否有可能改變TreeView內的ContentTemplate的渲染,使其只能充當佔位符?順便說一句,我不知道關於Snoop,這是一個非常方便的工具,謝謝。 – exoz 2011-12-19 19:46:54

+0

@ user1106026默認情況下,WPF控件是「無形的」,這意味着它們在屏幕上的顯示方式未在控件本身中定義。相反,WPF使用模板來確定如何在屏幕上繪製UI對象,並且可以覆蓋這些模板。例如,Snoop屏幕截圖顯示「TreeViewItem」被繪製爲包含「Expander」和「Border」的「Grid」,而「Border」包含「ContentPresenter」。你可以覆蓋這個,所以它只繪製'ContentPresenter' – Rachel 2011-12-19 19:53:04