以编程方式将子项添加到stackpanel不起作用

谁能发现我正在做的错误?

这是代码:

StackPanel stackPanel = new StackPanel(); stackPanel.Orientation = Orientation.Vertical; for (int index = _elements.Count - 1; index >= 0; index--) { FrameworkElement element = _elements[index]; WriteableBitmap tempBitmap = new WriteableBitmap(element, null); Image image = new Image(); image.Source = tempBitmap; stackPanel.Children.Add(image); } stackPanel.UpdateLayout(); _bitmap = new WriteableBitmap(stackPanel, null); _bitmap.Invalidate(); 

正如您所看到的,我正在创建一个临时Image,然后将其添加到stackpanel,然后创建一个最终的WriteableBitmap。 堆叠板的第一个孩子的身高是154,第二个是389。这一行之后:

  _bitmap.Invalidate(); 

当我看到PixelHeight时它只有389.我的第一个孩子去哪儿了?

虽然sLedgem和bathineni给出的答案都是正确的,但它似乎不符合我的情况。 另外,为什么我要将它们添加到布局中? 如果方便你,你可以,但在我的情况下,我希望它们在100%的内存,因为我的帮助类基本上用于打印没有任何参考屏幕上的任何UIElements。 在那种情况下,显然我不想将我的LayoutRoot或其他Panel传递给我的助手类只是为了制造这个黑客!

要求Silverlight运行时在内存中呈现元素。 您需要调用测量和排列:

所以我所缺少的通常是:

 stackPanel.Measure(new Size(width, height)); stackPanel.Arrange(new Rect(0, 0, width, height)); 

之前:

 _bitmap = new WriteableBitmap(stackPanel, null); 

我可以摆脱这条线:

 stackPanel.UpdateLayout(); 

希望这可以帮助那些来自这个线程的人并且遇到像我这样的问题,在你的助手类中找不到LayoutRoot是不可行的。

stackPanel或任何其他面板在添加到visulatree(任何视觉元素)之前都不会呈现..意味着..如果你已经向stackpanel添加了100个项目,那么在stackpanel在屏幕上具有视觉外观之前将不会生成这100个元素。

如果您不想在屏幕上显示stackpanel,请添加stackpanel并立即将其删除。 它会使stackpanel渲染它的子元素……

要么

在XAML中创建一个网格或堆栈面板,它具有1个像素的高度和宽度,并将您的堆栈面板添加到该网格或堆叠面板…因此它将无法在屏幕上显示,并将在背景上呈现….

bathineni是对的,你需要在拍摄快照之前渲染堆栈面板。 我建议让它渲染一个帧,然后在渲染后抓取位图

  CompositionTarget.Rendering += CompositionTarget_Rendering; } void CompositionTarget_Rendering(object sender, EventArgs e) { _bitmap = new WriteableBitmap(stackPanel, null); _bitmap.Invalidate(); }