代码中出现“指定元素已经是另一个元素的逻辑子级。请先将其断开连接”错误。有解决方法吗?

3

我有一个小问题。

这是我的代码:

stackPanelShapesContainer = new StackPanel();
InitializeStackPanle();

var gotFocusStackPanle =(StackPanel) canvas.Children[gotFocusStackPanelIndex];

foreach (UIElement child in gotFocusStackPanle.Children)
{
     UIElement uiElement = child;
     stackPanelShapesContainer.Children.Add(uiElement);
}

在上述代码的第9行,我遇到了以下错误 -
指定的元素已经是另一个元素的逻辑子元素。请先断开连接。
我该如何解决它?有什么解决方案吗?

2
你想做什么?这个错误似乎很明显... - Jon Skeet
1
你在尝试做什么?你正在尝试将画布的子元素添加到一个不相关的堆栈面板中。显然,你不能这样做,正如错误信息所说。 - Panagiotis Kanavos
1
很难说清楚到底发生了什么,但是 uiElement 已经是另一个 UI 元素的子级。在 WPF 中,一个 UIElement 不能成为多个元素的子级。 - Tigran
2个回答

2

uiElement 已经是 gotFocusStackPanle 的子元素,所以你不能将其添加到 stackPanelShapesContainer 中。

这就是错误信息所说的。

首先从 gotFocusStackPanle 中移除 uiElement

foreach (UIElement child in gotFocusStackPanle.Children.ToList())
{
     UIElement uiElement = child;
     gotFocusStackPanle.Remove(uiElement)
     stackPanelShapesContainer.Children.Add(uiElement);
}

2
我希望您能从评论和其他帖子中清楚地了解错误的原因;我假设您想要在一个面板中创建控件的副本并将其复制到另一个面板中,如果是这种情况,则必须首先克隆该控件,然后将其添加到新的面板中。
您可以通过使用 XamlWriter 将控件序列化,然后使用 XamlReader 进行反序列化来创建新的控件,类似于这样的方法。
foreach (UIElement child in gotFocusStackPanle.Children)  
{  
     string childXaml = XamlWriter.Save(child);

    //Load it into a new object:
    StringReader stringReader = new StringReader(childXaml);
    XmlReader xmlReader = XmlReader.Create(stringReader);
    UIElement clonedChild = (UIElement)XamlReader.Load(xmlReader);

    stackPanelShapesContainer.Children.Add(clonedChild);  
}  

但是,你可能会发现自己需要应用一些解决方法来使其正常工作,因为使用XamlWriter.Save存在一些限制(例如绑定)- XamlWriter.Save的序列化限制

以下是一些其他序列化方法 -

保留绑定的XAML序列化器

XamlWriter和绑定序列化


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接