19

这是我想将 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

4 回答 4

24

如果element是面板的子项(例如网格),您必须将其从面板的项集合中删除。如果它设置为Contenta ContentControl,则必须将该 Content 设置为 null (或任何其他不是 的element)。

于 2012-02-02T09:51:49.783 回答
5

纪尧姆

您可以尝试在 RemoveLogicalChild 之后额外使用RemoveVisualChild方法:

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

希望这会有所帮助,Piotr。

于 2012-02-02T09:25:40.463 回答
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

于 2013-01-30T02:09:30.900 回答
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);
            }
        }
    }
}
于 2017-11-20T18:52:53.770 回答