动态添加wpf控件以包装面板

我正在尝试动态地将控件添加到窗口上的包装面板但是在将两个包装面板控件添加到原始包装面板控件之后它不再添加这里是用于添加图像的代码

Random rn = new Random(); ImageContainer.Children.Add(displayimage(rn.Next(amount))); ImageContainer.InvalidateVisual(); 

我是wpf的新手,只是想知道我是做错了什么或丢失了什么。

任何帮助将不胜感激

编辑

  public WrapPanel displayimage(int i) { WrapPanel pn = new WrapPanel(); pn.Width = 350; pn.Height = 400; pn.Background = new SolidColorBrush(Colors.White); BitmapImage bm = new BitmapImage(new Uri(imagePaths[i])); Image im = new Image(); im.Source = bm; im.Height = 300; im.Width = 400; im.Margin = new Thickness(25,25,25,25); pn.Children.Add(im); pn.Margin = Location(pn); pn.ClipToBounds = true; return pn; } 

为了将图像放在容器控件中的随机位置,您不应该使用WrapPanel,而应使用Canvas 。 Canvas用于元素的绝对定位。 您可以通过设置Canvas.LeftCanvas.Top属性(或Canvas.RightCanvas.Bottom )来设置Canvas的子元素的位置。

此外,您不需要任何“内部”面板,因为Image是可以直接添加到任何容器的控件。

所以改变你的displayimage方法如下:

 public UIElement GetDisplayImage(int i) { var bm = new BitmapImage(new Uri(imagePaths[i])); var im = new Image { Source = bm, Height = 300, Width = 400 }; var location = Location(im); Canvas.SetLeft(im, location.X); Canvas.SetTop(im, location.Y); return im; } 

现在将这些图像添加到canvas:

 Random rn = new Random(); ImageCanvas.Children.Add(GetDisplayImage(rn.Next(amount)); 

InvalidateVisual不是必需的。


您可能还必须注意不要多次添加图像,因为Random.Next可能会多次返回相同的数字。