2012-02-02 111 views
17

這裏是我在將一個FrameworkElement附加到一個新窗口以將其發佈到PNG文件時出現的錯誤。指定的元素已經是另一個元素的邏輯子元素。首先將它斷開

所以我的想法是消除親子環節,叫我的方法,以及與此代碼再添加子:

this.RemoveLogicalChild(element); 
PublishFrameworkElement(element, stream); 
this.AddLogicalChild(element); 

但我得到了確切的同樣的錯誤......

我看了很多關於這個錯誤的問題,在這裏,但沒有回答我的問題 我錯過了什麼?

編輯:這裏是爲我工作的代碼:

var element = _GeneratedContent as FrameworkElement; 
var ParentPanelCollection = (element.Parent as Panel).Children as UIElementCollection; 
ParentPanelCollection.Clear(); 

FileStream stream = [...] 

if (element != null) 
{ 
    PublishFrameworkElement(element, stream); 
    ParentPanelCollection.Add(element); 
} 
stream.Close(); 

回答

17

如果element是Panel(例如Grid)的孩子,則必須將其從Panel的Children集合中刪除。如果它設置爲ContentControlContent,則必須將該內容設置爲空(或其他任何不是element)。

+1

這幫了我!我在我編輯的問題中發佈了代碼:) – 2012-02-02 10:44:24

+0

會設置爲空,斷開連接事件? – Rauld 2012-08-30 14:49:49

+0

不,您還必須刪除任何事件處理程序。 – Clemens 2012-08-30 14:57:45

5

紀堯姆

你可以嘗試另外使用RemoveVisualChild方法RemoveLogicalChild後:

this.RemoveLogicalChild(element); 
this.RemoveVisualChild(element); 
PublishFrameworkElement(element, stream); 

希望這會有所幫助, Piotr。

+0

我以前試過,但這給了我這個錯誤:「指定的視覺不是這個視覺的孩子。」 – 2012-02-02 09:46:41

+0

Guillaume,我發佈的代碼不會拋出這個異常,所以也許你在不同的上下文中使用它。請張貼更多代碼並更詳細地描述您的問題,以便我們更容易地爲您提供幫助。 – 2012-02-02 10:13:28

+0

另外,你的情況是什麼「這個」? – 2012-02-02 10:16:14

1

我有類似但有點不同的問題,但得到了相同的錯誤信息。我通過創建一個繼承的類並調用RemoveLogicalChild(因爲這是一個受保護的方法)來做出解決方法。

public partial class PopupWindow : Window 
{ 
    public PopupWindow() 
    { 
     InitializeComponent(); 
    } 

    protected override void OnClosed(EventArgs e) 
    { 
     base.OnClosed(e); 
     this.RemoveLogicalChild(this.Content); // since protected method 
    } 
} 

它爲我工作。我做了一個簡單的例子,你可以在這裏看到。

http://wpfgrid.blogspot.com/2013/01/wpf-error-specified-element-is-already.html

1

老問題,但我沒有與其他的答案運氣,所以我做了一個擴展方法來從其父刪除該項目。

public static class FrameworkElementHelper 
{ 
    public static void RemoveFromParent(this FrameworkElement item) 
    { 
     if (item != null) 
     { 
      var parentItemsControl = (ItemsControl)item.Parent; 
      if (parentItemsControl != null) 
      { 
       parentItemsControl.Items.Remove(item as UIElement); 
      } 
     } 
    } 
} 
相關問題