2016-03-03 13 views
0

我想将列表中的所有图像设置为网格。但我有与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个不同的图像,我不知道如何解决这个问题。

+1

是否有XAML与此相符?您是否100%肯定LayoutRoot是您期望的Grid? – WasGoodDone

+1

在添加到LayoutRoot之前,似乎有问题的图像是作为小孩添加的。你有没有检查'image.Parent'是否为空? – Domysee

+0

我发现问题。我回答说。 –

回答

1

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

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

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

Enumerable.Repeat文档说:

element
Type: TResult
The value to be repeated.

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

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

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

溶液将是使用一个for循环来实例化的图像。

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

这是非常有感觉性和逻辑性的。谢谢。 –

0

看来问题在于创建图像。 现在我不创建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); 
} 
相关问题