Указанный элемент уже является логическим дочерним элементом другого элемента. Сначала отключите его

вот ошибка, которую я имею, когда хочу привязать FrameworkElement к новому окну, чтобы опубликовать его в PNG файле.

Итак, моя идея - удалить ссылку parent-child, вызвать мой метод и снова добавить ребенка с помощью этого кода:

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

Но я получил ту же ошибку...

Я посмотрел много вопросов об этой ошибке, здесь, на SO, но никто не ответил на мою проблему Что мне не хватает?

EDIT: вот код, который работал у меня:

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

Если element является дочерним элементом панели (например, Grid), вы должны удалить ее из коллекции Children. Если он установлен как Content для ContentControl, вам нужно будет установить этот контент в значение null (или что-либо еще, что не является element).

Ответ 2

Гийом,

Вы можете попробовать дополнительно использовать метод RemoveVisualChild после RemoveLogicalChild:

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

Надеюсь, это поможет, Петр.

Ответ 3

У меня была аналогичная, но немного другая проблема, но она получила то же сообщение об ошибке. Я сделал обходной путь, создав унаследованный класс и вызвав 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

Ответ 4

Старый вопрос, но мне не повезло с другими ответами, поэтому я сделал метод расширения, чтобы удалить элемент из его родителя.

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