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

时间:2012-01-13 05:18:34

标签: c# silverlight silverlight-4.0

有人能发现我正在做的错误吗?

以下是代码:

        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。堆叠板的第一个孩子的身高是154,第二个是389.这一行之后:

 _bitmap.Invalidate();

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

3 个答案:

答案 0 :(得分:2)

虽然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是不可行的。

答案 1 :(得分:0)

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

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

OR

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

答案 2 :(得分:0)

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

     CompositionTarget.Rendering += CompositionTarget_Rendering;
 }

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

  }