2012-01-13 40 views
6

任何人都可以发现我正在做的错误吗?以编程方式将子项添加到堆栈面板不起作用

下面是代码:

 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在哪里我的第一个孩子去了?

回答

2

后,虽然都是由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在你的助手类中。

+0

需要添加的东西,尝试显式设置高度和宽度到堆栈面板并使用它来设置'Size'和'Rect' – 2015-12-22 18:20:01

0

stackPanel或任何其他面板在添加到visulatree(任何视觉元素)之前不会渲染.. 意味着..如果您已将100项添加到堆栈面板,那么在堆叠面板出现其视觉外观之后,这些100个元素将不会生成屏幕..

如果你不想在屏幕上显示堆叠面板,然后添加堆叠面板,立即删除它。它会让StackPanel中呈现它的子元素......

OR

创建XAML网格或StackPanel中有1个像素的高度和宽度,你StackPanel中添加到网格或StackPanel的......所以不会在屏幕上可见,它会在背景上呈现....

+0

你的回答是正确的,但并不总是可行的。看到我的答案。 – TCM 2012-01-15 03:34:52

0

bathineni是正确的,你需要呈现之前拍摄快照的堆叠面板。我建议让它渲染一帧,然后抢位图已经呈现

 CompositionTarget.Rendering += CompositionTarget_Rendering; 
} 

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

    } 
+0

虽然这是正确的,但并不总是可行的。看到我的答案。 – TCM 2012-01-15 03:33:22

相关问题