2010-04-30 61 views
3

我們已經申請大致結構是這樣的:印刷在Silverlight 4

<Grid x:Name="LayoutRoot"> 
    <ScrollViewer> 
<Canvas x:Name="canvas"> 
    <StackPanel> < Button /><Slider /><Button /></StackPanel> 
    <custom:Blob /> 
    <custom:Blob /> 
    <custom:Blob /> 
</Canvas> 
    </ScrollViewer> 
</Grid> 

每個斑點由1個或多個矩形,直線,和文本框;它們位於畫布上的任何位置。

如果我打印使用LayoutRoot文檔:

PrintDocument pd = new PrintDocument(); 
pd += (s, pe) => { pe.PageVisual = LayoutRoot; }; 
pd.Print("Blobs"); 

...它就像一個打印屏幕 - 滾動條,滑塊,是可見的斑點 - 打印。

如果我設置PageVisual = canvas,則不會打印任何內容。

我該如何獲得所有的blob對象,並只是打印這些對象?我是否需要將它們複製到另一個容器中,並將該容器分配給PageVisual?我可以使用ViewBox來確保它們都適合在一個頁面上嗎?

感謝任何指針....

回答

2

第一想法,來到在閱讀您的文章介意是你的畫布組你的Blob對象的大小。因此,發現了一些有趣的片段,可以幫助你:

除了指定的 的UIElement,您可以用 PrintPageEventArgs .. :: PrintableArea 屬性來獲取物理 尺寸的打印區域。如果UIElement超過 PrintableArea,則內容將被剪裁在 PrintableArea的邊界處 。 可打印區域的尺寸是基於屏幕的 像素。

您使用 PrintPageEventArgs .. ::。HasMorePages的 屬性來打印文檔 多個頁面。 PrintPageEventArgs .. ::。HasMorePages的默認值爲 false,因此無需爲單頁文檔設置 。但是,如果 有多個要打印的頁面,則您將 設置爲 PrintPageEventArgs .. ::。HasMorePages 屬性爲true以指示 還有其他頁面要打印。 您設置 PrintPageEventArgs .. ::。HasMorePages 在PrintPage事件 處理程序返回false時,最後一頁打印爲 。

Documentation article

+0

有幫助,謝謝。可能有一種方法可以指定要打印的畫布的區域(矩形)...? 或者類似地,在StartPrint事件中,將Canvas的大小調整爲所有對象的最小邊界矩形,然後在EndPrint事件中恢復其大小。 最後,一個ViewBox可以轉換一個Canvas以適合一個頁面嗎? – Number8 2010-05-02 12:03:43

+0

我不確定,我沒有試過這個,但是當你指定你有超過1頁並且內容不合適時,它必須做一些事情。 但是如果它確實什麼都不做,那麼在打印之前,您可能需要縮放分組畫布,然後在完成打印後將其縮小。 – texmex5 2010-05-03 04:17:26

0

可以在打印前應用在LayoutRoot尺度變換分析。

但我遇到了一個問題,其中LayoutRoot在打印後保持縮小/放大。 (問題here