以编程方式将子项添加到堆栈面板不起作用
任何人都可以发现我正在做的错误吗?以编程方式将子项添加到堆栈面板不起作用
下面是代码:
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();
正如你可以看到我创建一个临时的图像,然后将其添加到StackPanel中,然后创建一个最终WriteableBitmap的。 MYY StackPanel中的第一个孩子是身高154和第二一个就是389这条线之后:
_bitmap.Invalidate();
,当我看到PixelHeight它仅仅是389在哪里我的第一个孩子去了?
后,虽然都是由sLedgem和bathineni给出的答案是正确的,它似乎不适合我的情况。另外为什么我想将它们添加到布局?如果它对您很方便,您可以但在我的情况下,我希望它们在100%的内存中,因为基本上用于打印的辅助类没有任何对屏幕上显示的任何UIElements的引用。在这种情况下,显然我不希望将我的LayoutRoot或其他面板传递给我的助手类,只是为了使这个黑客!
要求Silverlight运行时呈现内存中的元素。你需要调用措施和安排:
所以一般都是我缺少的是:
stackPanel.Measure(new Size(width, height));
stackPanel.Arrange(new Rect(0, 0, width, height));
前:
_bitmap = new WriteableBitmap(stackPanel, null);
而且我可以摆脱这行:
stackPanel.UpdateLayout();
希望这可以帮助有人来这个线程和像我一样的问题,找到LayoutRoo是不可行的t在你的助手类中。
stackPanel或任何其他面板在添加到visulatree(任何视觉元素)之前不会渲染.. 意味着..如果您已将100项添加到堆栈面板,那么在堆叠面板出现其视觉外观之后,这些100个元素将不会生成屏幕..
如果你不想在屏幕上显示堆叠面板,然后添加堆叠面板,立即删除它。它会让StackPanel中呈现它的子元素......
OR
创建XAML网格或StackPanel中有1个像素的高度和宽度,你StackPanel中添加到网格或StackPanel的......所以不会在屏幕上可见,它会在背景上呈现....
你的回答是正确的,但并不总是可行的。看到我的答案。 – TCM 2012-01-15 03:34:52
bathineni是正确的,你需要呈现之前拍摄快照的堆叠面板。我建议让它渲染一帧,然后抢位图已经呈现
CompositionTarget.Rendering += CompositionTarget_Rendering;
}
void CompositionTarget_Rendering(object sender, EventArgs e)
{
_bitmap = new WriteableBitmap(stackPanel, null);
_bitmap.Invalidate();
}
虽然这是正确的,但并不总是可行的。看到我的答案。 – TCM 2012-01-15 03:33:22
需要添加的东西,尝试显式设置高度和宽度到堆栈面板并使用它来设置'Size'和'Rect' – 2015-12-22 18:20:01