“指定的元素已经是另一个元素的逻辑子元素.首先断开连接“错误在我的代码中,任何解决方案

本文关键字:元素 错误 连接 我的 解决方案 任何 断开 代码 另一个 | 更新日期: 2023-09-27 18:37:12

我有一点问题。

这是我的代码:

stackPanelShapesContainer = new StackPanel();
InitializeStackPanle();
var gotFocusStackPanle =(StackPanel) canvas.Children[gotFocusStackPanelIndex];
foreach (UIElement child in gotFocusStackPanle.Children)
{
     UIElement uiElement = child;
     stackPanelShapesContainer.Children.Add(uiElement);
}

在上面代码的第 9 行中,我收到以下错误 -

指定的元素已经是另一个元素的逻辑子元素。 首先断开连接。

我该如何解决它?有什么解决办法吗?

“指定的元素已经是另一个元素的逻辑子元素.首先断开连接“错误在我的代码中,任何解决方案

我希望您可以从评论和其他帖子中清楚错误的原因;我假设您想将一个面板中存在的控件副本创建到另一个面板中,如果是这种情况,那么您必须先克隆控件,然后将其添加到新面板。

您可以通过首先使用 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 和绑定序列化

uiElement已经是gotFocusStackPanle的子代,所以不能把它添加到stackPanelShapesContainer

这就是错误消息所说的。

首先从gotFocusStackPanle中删除uiElement

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