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

TCM*_*TCM 6 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();
Run Code Online (Sandbox Code Playgroud)

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

 _bitmap.Invalidate();
Run Code Online (Sandbox Code Playgroud)

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

TCM*_*TCM 2

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

要求 Silverlight 运行时渲染内存中的元素。您需要调用 Measure 和 Arrange:

所以通常我所缺少的是:

stackPanel.Measure(new Size(width, height));
stackPanel.Arrange(new Rect(0, 0, width, height));
Run Code Online (Sandbox Code Playgroud)

前:

_bitmap = new WriteableBitmap(stackPanel, null);
Run Code Online (Sandbox Code Playgroud)

我可以摆脱这一行:

stackPanel.UpdateLayout();
Run Code Online (Sandbox Code Playgroud)

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