这是我想要将FrameworkElement附加到新窗口以将其发布到PNG文件时出现的错误。
所以我的想法是删除父子链接,调用我的方法,然后使用以下代码再次添加子代:
this.RemoveLogicalChild(element);
PublishFrameworkElement(element, stream);
this.AddLogicalChild(element);
但我得到了完全相同的错误......
我在这里看了很多关于这个错误的问题,但没有人回答我的问题 我错过了什么?
编辑:这是适用于我的代码: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();
答案 0 :(得分:18)
如果element
是Panel的子级(例如Grid),则必须将其从Panel的Children集合中删除。如果将其设置为Content
的{{1}},则必须将该内容设置为null(或其他任何非ContentControl
)。
答案 1 :(得分:5)
纪尧姆
您可以尝试在 RemoveLogicalChild 之后另外使用 RemoveVisualChild 方法:
this.RemoveLogicalChild(element);
this.RemoveVisualChild(element);
PublishFrameworkElement(element, stream);
希望这有帮助, 彼得。
答案 2 :(得分:1)
我有类似但略有不同的问题,但得到了相同的错误消息。我通过创建一个继承的类并调用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
答案 3 :(得分:1)
旧问题,但我没有其他答案的运气,所以我做了一个扩展方法,从其父项中删除该项目。
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);
}
}
}
}