Указанный элемент уже является логическим дочерним элементом другого элемента.Сначала отключи - PullRequest
17 голосов
/ 02 февраля 2012

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

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

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

Но я получил точно такую ​​же ошибку ...

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

РЕДАКТИРОВАТЬ: вот код, который работал для меня:

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

Ответы [ 4 ]

18 голосов
/ 02 февраля 2012

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

5 голосов
/ 02 февраля 2012

Гийом,

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

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

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

1 голос
/ 20 ноября 2017

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

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);
            }
        }
    }
}
1 голос
/ 30 января 2013

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

...