指定的元素已经是另一个元素的逻辑子元素。 首先断开它

这是我想要将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(); 

如果element是Panel的子级(例如Grid),则必须将其从Panel的Children集合中删除。 如果将其设置为ContentControl Content ,则必须将该Content设置为null(或其他任何不是element )。

纪尧姆

您可以尝试在RemoveLogicalChild之后另外使用RemoveVisualChild方法:

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

希望这有帮助,彼得。

我有类似但略有不同的问题,但得到了相同的错误消息。 我做了一个变通方法,创建一个inheritance的类并调用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

老问题,但我没有运气与其他答案,所以我做了一个扩展方法从其父项中删除该项目。

 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); } } } }