Указанный элемент уже является логическим дочерним элементом другого элемента. Сначала отключи
Вот ошибка, которую я имею, когда я хочу прикрепить FrameworkElement к новому окну, чтобы опубликовать его в файл PNG.
Поэтому моя идея состоит в том, чтобы удалить ссылку parent-child, вызвать мой метод и снова добавить child с этим кодом:
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 ответа
Если element
является дочерним элементом Panel (например, Grid), вы должны удалить его из коллекции Children для Panel. Если это установлено как Content
из ContentControl
вы должны установить этот Контент на ноль (или что-то еще, что не element
).
Гийом,
Вы можете попробовать дополнительно использовать метод RemoveVisualChild после RemoveLogicalChild:
this.RemoveLogicalChild(element);
this.RemoveVisualChild(element);
PublishFrameworkElement(element, stream);
Надеюсь, это поможет, Петр.
Старый вопрос, но мне не повезло с другими ответами, поэтому я сделал метод расширения, чтобы удалить элемент из родительского элемента.
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);
}
}
}
}
У меня была похожая, но немного другая проблема, но я получил то же сообщение об ошибке. Я сделал обходной путь, создав унаследованный класс и вызвав 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