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

本文关键字:添加 stackpanel 不起作用 编程 方式 | 更新日期: 2023-09-27 18:20:22

有人能发现我犯的错误吗?

这是代码:

        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。stackpanel的Myy第一个孩子身高154,第二个孩子身高389。此行之后:

 _bitmap.Invalidate();

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

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

虽然sLedgem和bathineni给出的答案都是正确的,但似乎不适合我的情况。此外,我为什么要将它们添加到布局中?如果你方便的话,你可以,但在我的情况下,我希望它们在100%的内存中,因为我的助手类基本上用于打印,没有引用屏幕上出现的任何UIElement。在这种情况下,很明显,我不想把我的LayoutRoot或其他面板传递给我的助手类,只是为了进行这次黑客攻击!

要求Silverlight运行时呈现内存中的元素。您需要调用Measure and Arrange:

所以通常我所缺少的只是:

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();
  }