将Canvas的所有子元素复制到另一个Canvas中的C#代码

4
我正在寻找一种方法将一个画布的所有子元素复制到另一个画布中。由于子元素的类型不同,因此类型并不重要。
 private void add_template_Click(object sender, RoutedEventArgs e)
   {
       root.Children.Clear();
       foreach(var c in Template_canvas1.Children)
       {
           root.Children.Add(c);
       }
   }

上面的代码会出现“无效操作错误”的错误。我想把template_canvas1的子元素复制到根画布上。有什么建议?

你当前的代码有什么问题? - caesay
它显示无效操作错误。 - NotABot
1个回答

15

问题是,一个 UIElement 一次只能属于一个父级。为了将您的项目添加到 root 画布中,您需要先将它们从 Template_canvas1 画布中移除。

请参考以下代码。我创建了一个 UIElements 数组来复制,然后将它们从 Template_canvas1 移除,再添加到 root 中。

private void add_template_Click(object sender, RoutedEventArgs e)
{
    var childrenList = Template_canvas1.Children.Cast<UIElement>().ToArray();
    root.Children.Clear();
    foreach (var c in childrenList)
    {
        Template_canvas1.Children.Remove(c);
        root.Children.Add(c);
    }
}

如果您不想从Template_canvas1中删除元素,则还有一种选择,可以创建UIElements的深层副本。请参见以下示例,其中我没有从Template_canvas1中删除项目:

private void add_template_Click(object sender, RoutedEventArgs e)
{
    root.Children.Clear();
    foreach (UIElement child in Template_canvas1.Children)
    {
        var xaml = System.Windows.Markup.XamlWriter.Save(child);
        var deepCopy = System.Windows.Markup.XamlReader.Parse(xaml) as UIElement;
        root.Children.Add(deepCopy);
    }
}

这是我找到的最简单和最聪明的答案 :) - NotABot
@thewarri0r9:我还为您添加了另一个选项可以尝试。 - caesay
另一种选项对于Windows Phone SDK无效,您能建议一些更改吗? - NotABot

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