2011-07-05 61 views
0

我知道如何擴大從一個TreeView的所有節點:展開TreeViewItems在WPF快速

<TreeView.ItemContainerStyle> 
      <Style TargetType="TreeViewItem"> 
       <Setter Property="TreeViewItem.IsExpanded" Value="True"/> 
      </Style> 
</TreeView.ItemContainerStyle> 

唯一的問題是,它需要大約一分鐘展開所有節點...這可能是因爲有這麼多項目。我怎麼能加快這個過程?


編輯:

所以我有一個列表:List<ScanItems> MyFilesList

ScanItem是具有如屬性的類:真實姓名,名稱,大小,dateCreated會,ComparePath和我需要其他特定屬性這就是爲什麼我沒有使用FileInfo類。

ScanFile是繼承自ScanItems的類,因此它與添加其他自定義屬性一樣。

ScanDir是另一個類,從ScanItem也繼承了它具有以下屬性:

public List<ScanItem> items{get;set;} 

爲什麼我已經包括財產,這樣我可以有另一個列表withing一個項目的原因。

查看this question關於如何從文件列表填充樹視圖。

所以現在我希望我正確地解釋我的自我如何將該列表綁定到樹視圖。

現在讓我解釋一下如何將文件添加到MyFilesList。我創建了一個遞歸方法來查找目錄中的文件。如果該curent目錄包含一個文件,然後添加一個ScanFile項目。如果它包含一個文件夾,然後添加一個ScanDir對象並再次調用相同的方法傳遞ScanDir列表。所以這個過程大約需要8秒鐘來掃描我的外部硬盤。在執行該方法後,我的列表可能只包含4個項目,但其中一個項目將包含可能包含20個項目的列表等等,就像文件夾可能包含5個項目,並且如果其中一個項目碰巧是文件夾可以有額外的項目。

所以,當我執行TreeView.DataContext = MyFilesList樹視圖被填充不到一秒鐘。但是,當我包括:

<TreeView.ItemContainerStyle> 
      <Style TargetType="TreeViewItem"> 
       <Setter Property="TreeViewItem.IsExpanded" Value="True"/> 
      </Style> 
</TreeView.ItemContainerStyle> 

該樹型內樹視圖風格需要長時間加載。

+0

我們有多少人在談論?如果你使用Linq顯示來自數據庫的數據,那麼可能看看你的linq在做什麼 - 也許你是分別單擊每條記錄的數據庫。 – hyp

+0

列表綁定到樹視圖。樹視圖由大約60,000個項目組成。當我從項目中排除樣式時,不需要花時間加載。 –

+1

所以這是很多,但你如何從數據庫檢索項目?代碼會很好。如果你正在使用導航屬性「Child」(或類似的)的linq,那麼當你展開一個節點時,最有可能的是你碰到數據庫了...大約60k次 – hyp

回答

2

看看Bea Stollnitz關於treeviews和性能的帖子。
相關的職位是:

她做得很好,在詳細解釋所有的你可以嘗試的選擇。太多的內容把它放在這裏。

+0

[Part I](http://www.zagstudio.com/blog/475)/ [Part II](http://www.zagstudio.com/blog/477)/ [Part III](http:// www.zagstudio.com/blog/480) – SuperOli

+2

現在所有這些鏈接都已死亡。 :( –

2

您是否嘗試過通過treeviewitems循環和「手動」擴大他們通過設置

IsExpanded = true; 

如果不工作,然後圍繞嘗試工作,並添加到您的ScanDir(我相信這是唯一的類你擴展?)一個屬性IsExpanded(或類似)並綁定到你的模板。不是最好的解決方案的做法明智,但如果它會工作...

+0

謝謝。這對我很好! – Daro