2010-10-19 24 views
0

因此,對於我的應用程序,我只是有一個圖像加載,然後在一個選項卡項目中的網格。點擊一個按鈕後,我創建了一個新的標籤項和相關的代碼來加載其他東西。但是,回到第一個選項卡時,遇到此錯誤:WPF樹錯誤導航回到以前的選項卡

「在連接到新的父級Visual之前,必須斷開與當前父級Visual的指定子級」。

具體位置:

public class VisualsHost : FrameworkElement 
{ 

    DrawingVisual _square; 

    public VisualsHost() 
    { 
     _square = new DrawingVisual(); 
     this.Loaded += new RoutedEventHandler(OnLoaded); 
    } 

    public void OnLoaded(object sender, RoutedEventArgs e) 
    { 

     AddVisualChild(_square); 
     AddLogicalChild(_square); 
    } 

這只是我爲我用我的主標籤內容我選擇方形容器。

所以我想知道,究竟發生了什麼,我將如何去解決這個問題?

在我的第一個選項卡的內容的簡要結構爲:

的tabcontrol> DockPanel中 - >列表框 - >格(itemspanelcontainer風格) - > listboxitems ...

回答

1

Loaded事件被稱爲每次你選擇這個標籤,然後再次添加_square!

Loaded事件不一定只在第一次加載時調用一次 - 例如,如果您正在使用系統主題並更改了系統主題,則可能再次加載該元素,並重新加載所有可視元素。在您的情況下,視覺樹會以某種方式再次失效 - 也許是因爲您對圖像的綁定再次被讀取(如果這是原因,那麼也可以將綁定更改爲OneTime)。這裏更多的信息:http://msdn.microsoft.com/en-us/library/ms754221.aspx這裏:http://blogs.msdn.com/b/mikehillberg/archive/2006/09/19/loadedvsinitialized.aspx

UPDATE:從第二連桿上述評論,適合你的情況:

「如果我可以添加Loaded事件也提升當過一個UI如果在Tab'A'中有一個名爲'x'的按鈕,當用戶切換到Tab'B'時,會爲x引發UnLoaded事件,當用戶切換回Tab時一個加載事件是爲x引發的,但不是初始化事件...「

您應該能夠確認在調試時斷點是否確實如此更改。如果是:你可以使用一個標誌,以防止事件做任何事情或刪除事件它運行後:

public class VisualsHost : FrameworkElement 
{ 
    bool hasLoaded = false; 
    DrawingVisual _square; 

    public VisualsHost() 
    { 
    _square = new DrawingVisual(); 
    this.Loaded += new RoutedEventHandler(OnLoaded); 
    } 

    public void OnLoaded(object sender, RoutedEventArgs e) 
    { 
    if(!hasLoaded) 
    { 
     AddVisualChild(this._square); 
     AddLogicalChild(this._square); 
     this.hasLoaded = true; 
     this.Loaded -= OnLoaded; // unnecessary if using the hasLoaded flag 
    } 
    } 
} 
+0

但是,主要問題是,當我進入新選項卡時會發生什麼?一棵新的樹是被創造出來的東西,而舊的樹被消滅了?顯然,舊的不是。對我來說,WPF更有意義的是讓內存知道每個交換機上以前的視覺/邏輯樹的結構和狀態。 – Ilya 2010-10-19 17:24:19

+0

沒有新的創建 - 一個較小的事實:Loaded事件不僅在第一次加載時調用一次 - 例如,如果您正在使用系統主題並更改了系統主題,則可能再次加載該元素。在你的情況下,視覺樹會以某種方式再次失效 - 也許是因爲你對圖像的綁定再次被讀取(如果這是原因,也可以將綁定改爲OneTime)。更多的信息在這裏:http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.loaded.aspx – markmnl 2010-10-20 04:05:57

+0

一旦學習這個我自己,我不得不添加檢查,我的Loaded事件處理程序只運行一遍我的碼.. – markmnl 2010-10-20 04:07:12