网格子项已经是另一个视觉对象或组合目标的根

本文关键字:对象 组合 目标 视觉 另一个 网格 | 更新日期: 2023-09-27 18:37:11

我想将所有图像从列表设置为网格。但是我在网格中添加第二张图像时遇到问题 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 张不同的图像,我不知道如何解决这个问题。

网格子项已经是另一个视觉对象或组合目标的根

问题在于您创建图像的代码。

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

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

Enumerable.Repeat的文件说:

元素
类型:特鲁特
重复的值。

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

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

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

解决方案是使用 for 循环来实例化图像。

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

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

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);
}