2011-08-17 76 views
0

我有一页需要打印两个UIElement,其中一个是StackPanel,另一个是用于显示测试分数的自定义图形控件。图形控件可以根据要显示的测试数量来设置任意长度,所以有时候我可以同时适用于一个页面,而其他时间则需要单独的页面。在Silverlight 4中打印多个UIElements

在单独的页面上打印它们可以正常工作,因为我只是将UIElement设置为pageview,我遇到的问题是我无法弄清楚如何将它们组合在单个页面上进行打印。我尝试在代码隐藏中创建一个StackPanel并向其中添加元素,但由于元素只能有一个父元素,因此我必须创建临时对象来保存每个元素,同时从原始父元素中删除,然后将临时元素赋予新的StackPanel 。问题是,在我这样做后,所有的绑定数据都会丢失

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

回答

0

而不是将实际元素添加到StackPanel进行打印,您可以创建这些元素的快照并仅将图像添加到StackPanel。您可以从UIElement使用下面的方法来创建一个Image

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; 
} 
+0

在WPF中,更简单的方法是使用VisualBrush。不适用于SL虽然 –

+0

好的,所以我的下一个问题是有没有办法只拍摄UIElement的某个部分?假设我想使用整个页面作为元素,计算我需要的页数,然后从顶部到-1024,然后从-1024到-2048拍摄一张照片,依此类推,直到我得到每一页。这可能吗? – Josh

+0

@Josh - 您可以尝试使用该WriteableBitmap进行游戏。这可能是因为你可以将UIElement的特定部分渲染给它。不幸的是,我没有一个完整的解决方案。 –

0

或者只是把图像中的Canvas,然后比较Canvas的身高和形象的高度来计算页数。