首页 文章

Grid child已经是另一个视觉或compositionTarget的根

提问于
浏览
1

我想要将所有图像从列表设置为网格 . 但我在使用 Children.Add 在网格中添加第二个图像时遇到问题 . 这是我的例子:

List<Image> images = new List<Image>(8);
 images.AddRange(Enumerable.Repeat(new Image(), 8));//8 empty images

然后设置图像:

foreach (var image in images)
{
  BitmapImage b = new BitmapImage();
  b.BeginInit();
  b.UriSource = new Uri("path");
  b.EndInit();
  image.Source = b;
  image.Width = 50;
  image.Height = 50;
}

然后在一个函数调用中这样:

private void put_images()
{
  int i = 0;
  foreach (var image in images)
  {
    Grid.SetRow(image, i);
    Grid.SetColumn(image, i);
    LayoutRoot.Children.Add(image);//here is error
    i++;
  }
}

我遇到了运行时错误: Additional information: Specified Visual is already a child of another Visual or the root of a CompositionTarget.

我不明白为什么,因为我有8个不同的图像,我不知道如何解决这个问题 .

2 回答

  • 0

    问题是您创建图像的代码 .

    images.AddRange(Enumerable.Repeat(new Image(), 8));
    

    这是一个图像对象,集合中有8个引用 .

    Enumerable.Repeat的文档说:

    element类型:TResult要重复的值 .

    new Image() 的值是该Image的 reference .
    这意味着您对集合中的同一对象有8个引用 .

    您可以通过比较列表中的第一个条目和第二个条目来轻松验证 .

    images[0] == images[1] //=true
    

    solution 将使用 for 循环来实例化图像 .

    for(int i = 0; i < 8; i++) images.Add(new Image());
    
  • 2

    似乎问题在于创建图像 . 现在我不创建8个空图像,但我创建了Image,然后添加列表 . 现在它的工作:

    for(int i = 0; i < 8; i++)
    {
      Image a = new Image();
      BitmapImage b = new BitmapImage();
      b.BeginInit();
      b.UriSource = new Uri("path");
      b.EndInit();
      a.Source = b;
      a.Width = 50;
      a.Height = 50;
      images.Add(a);
    }
    

相关问题