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 行中,我收到以下错误 -

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

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

4

2 回答 2

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 和绑定序列化

于 2012-06-14T08:33:02.607 回答
2

uiElement已经是 的孩子gotFocusStackPanle,因此您不能将其添加到stackPanelShapesContainer.

这就是错误消息所说的。

uiElement从第一个删除gotFocusStackPanle

foreach (UIElement child in gotFocusStackPanle.Children.ToList())
{
     UIElement uiElement = child;
     gotFocusStackPanle.Remove(uiElement)
     stackPanelShapesContainer.Children.Add(uiElement);
}
于 2012-06-14T07:34:29.223 回答