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 に答える