Xaml 在Silverlight 4中打印多个UIElement

Xaml 在Silverlight 4中打印多个UIElement,xaml,printing,silverlight-4.0,uielement,Xaml,Printing,Silverlight 4.0,Uielement,我有一个页面,其中有两个需要打印的UIElements,一个是StackPanel,另一个是用于显示考试分数的自定义图形控件。根据要显示的测试数量,graph控件可以是任意长度,因此有时我可以在一个页面上同时显示这两个控件,而其他时候则需要单独的页面 在单独的页面上打印它们效果很好,因为我只是将UIElement设置为pagevisual,我遇到的问题是,我不知道如何将它们组合在一个页面上打印。我尝试在codebehind中创建StackPanel并将元素添加到其中,但由于元素只能有一个父元素,

我有一个页面,其中有两个需要打印的
UIElement
s,一个是
StackPanel
,另一个是用于显示考试分数的自定义图形控件。根据要显示的测试数量,graph控件可以是任意长度,因此有时我可以在一个页面上同时显示这两个控件,而其他时候则需要单独的页面

在单独的页面上打印它们效果很好,因为我只是将UIElement设置为pagevisual,我遇到的问题是,我不知道如何将它们组合在一个页面上打印。我尝试在codebehind中创建StackPanel并将元素添加到其中,但由于元素只能有一个父元素,因此在从原始父元素移除时,我必须创建临时对象来保存每个子元素,然后将临时对象提供给新的StackPanel。问题是,在我这样做之后,所有绑定的数据都会丢失


任何想法都会很棒!谢谢。

您可以创建这些元素的快照,只向
堆栈面板添加图像,而不是向
堆栈面板添加实际元素进行打印。您可以使用以下方法从
ui元素
创建
图像

public static Image CreateElementImage(UIElement element) 
{
    var bitmap = new WriteableBitmap((int)element.RenderSize.Width, (int)element.RenderSize.Height);

    Array.Clear(bitmap.Pixels, 0, bitmap.Pixels.Length);
    bitmap.Render(element, element.RenderTransform);
    bitmap.Invalidate();

    var result = new Image {Source = bitmap};

    return result;
}

或者只需将图像放入
画布
,然后比较
画布
的高度和图像高度来计算页数。

在WPF中,更简单的方法是使用VisualBrush。不适用于SL ThoughOk,所以我的下一个问题是,有没有办法只拍摄UIElement的某一部分?假设我想使用整个页面作为元素,计算我需要多少页面,然后从顶部到-1024,再到-1024到-2048,依此类推,直到我有了每个页面的图片。这可能吗?@Josh-你可以试着玩这个可写的位图。您可以将UIElement的特定部分呈现给它。不幸的是,我没有一个完整的解决方案给你。或者有没有一种方法可以在创建位图后将其分割成若干块?我可以拍摄整个页面的图像,然后以某种方式将其分割成适合打印页面的图像。