【问题标题】:Adding children to stackpanel programmatically not working以编程方式将子项添加到堆栈面板不起作用
【发布时间】:2012-01-13 05:18:33
【问题描述】:

任何人都可以发现我正在做的错误吗?

代码如下:

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

如您所见,我正在创建一个临时图像,然后将其添加到堆栈面板,然后创建最终的 WriteableBitmap。我的 stackpanel 的第一个孩子身高 154,第二个孩子身高 389。在此行之后:

 _bitmap.Invalidate();

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

【问题讨论】:

    标签: c# silverlight silverlight-4.0


    【解决方案1】:

    虽然 sLedgem 和 Bathineni 给出的两个答案都是正确的,但它似乎不适合我的情况。另外,我为什么要将它们添加到布局中?如果对您方便,您可以,但在我的情况下,我希望它们位于 100% 内存中,因为我的帮助程序类基本上用于打印,并没有对屏幕上出现的任何 UIElements 进行任何引用。在那种情况下,显然我不想将我的 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 是不可行的。

    【讨论】:

    • 要补充的东西,尝试显式设置堆栈面板的高度和宽度,并用它来设置SizeRect
    【解决方案2】:

    stackPanel 或任何其他面板在添加到 visulatree(任何视觉元素)之前不会呈现。 意思是..如果您向 stackpanel 添加了 100 个项目,则在 stackpanel 在屏幕上显示其视觉外观之前不会生成这 100 个元素..

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

    在 XAML 中创建一个高度和宽度为 1 像素的网格或堆栈面板,然后将您的堆栈面板添加到该网格或堆栈面板中......这样它就不会在屏幕上可见,而是会在背景上呈现......

    【讨论】:

    • 您的答案是正确的,但并不总是可行的。看我的回答。
    【解决方案3】:

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

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

    【讨论】:

    • 虽然这是正确的,但并不总是可行的。看我的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-01
    • 1970-01-01
    • 2016-02-02
    • 2011-11-08
    相关资源
    最近更新 更多