问题
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