Specified element is already the logical child of another element. Disconnect it first

那年仲夏 提交于 2019-12-04 02:59:42

问题


here is the error I have when I want to attach a FrameworkElement to a new Window to publish it to a PNG file.

So my idea is to remove the parent-child link, call my method, and add the child again with this code :

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

But I got the exact same error...

I looked a lot of questions about this error, here on SO, but none answered to my problem What am I missing ?

EDIT : here is the code that worked for me :

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

回答1:


If element is the child of a Panel (e.g. Grid) you have to remove it from the Panel's Children collection. If it is set as Content of a ContentControl, you'd have to set that Content to null (or anything else that is not element).




回答2:


Guillaume,

You can try to additionally use RemoveVisualChild method after RemoveLogicalChild:

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

Hope this helps, Piotr.




回答3:


I had similar but slightly different issue but got the same error message. I made a workaround by making an inherited class and calling RemoveLogicalChild (since this is a protected method).

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

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

It worked for me. I made a simple example you can see here.

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




回答4:


Old question but I didn't have luck with the other answers, so I made a extension method to remove the item from its parent.

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


来源:https://stackoverflow.com/questions/9109738/specified-element-is-already-the-logical-child-of-another-element-disconnect-it

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!