“指定的元素已经是另一个元素的逻辑子元素.首先断开连接“错误在我的代码中,任何解决方案
本文关键字:元素 错误 连接 我的 解决方案 任何 断开 代码 另一个 | 更新日期: 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);
}