2013-02-06 45 views
3

樹視圖不具有ScrollIntoView()方法
的唯一方法是調用TreeVewItem.BringIntoView()爲相應的數據項的容器。
但是,如果節點不可見並且尚未生成容器,則ItemsControl.ItemContainerGenerator.ContainerFromItem()將返回null
如何強制ItemContainerGenerator爲項目生成容器或如何在啓用UI虛擬化時將TreeView滾動到展開節點?

所以應該有一些辦法強迫ItemContainerGenerator爲項目創建容器。

合理的問題是:如何節點進行擴展,並保持隱形?

輕鬆! IsExpanded綁定到虛擬機的屬性。並且UI虛擬化按預期工作:
當手動滾動到項目完成時,TreeViewItem.Expanded的事件處理程序被調用ony。

回答

1

我不能保證這個問題是很相似的幫助,但我想,既然我無法找到我自己的問題,我會在這裏發佈,因爲這是類似的,一個很好的答案,我想通了,如何解決我的問題。

我有帆布控制工作,並具有被放置在畫布上,並有的ItemsControl控件的XAML UI定義的一部分,複雜的UI元素。該的ItemsControl的在他們的ItemTemplate定義的DataTemplates集。

因此,我的對象的某些方面只有在Visual Tree更新後纔會完全生成。這不是拖拽和使用這些項目時的問題,因爲當我需要它們時,ItemContainerGenerator已經生成了這些項目。但是,在可視化樹繪製自己之前,嘗試在Canvas加載時從數據庫重新生成項目時,這是一個問題。

我發現的唯一真正的方法來解決這個問題是隻啓動上放置在畫布上的「輔助對象」(即配合物進入該ItemContainerGenerators使物體)一旦LayoutUpdated事件畫布有工作被解僱。

public class DesignerCanvas : Canvas 
{ 
    public void LoadCanvasFromDB() 
    { 
    ... 
    [loading items from the database, part one] 
    LayoutUpdated += DesignerCanvas_LayoutUpdated; 
    } 

    void DesignerCanvas_LayoutUpdated(object sender, EventArgs e) 
    { 
    LayoutUpdated -= DesignerCanvas_LayoutUpdated; 
    [loading items from the database which tie to UI elements from part one] 
相關問題