2012-04-25 28 views
1

我必須打印一個顯示的TreeView。如何呈現(位圖)只有一部分的Visual?

將根TreeViewItem呈現爲位圖,爲我提供了整個(甚至不可見的節點)樹的圖像。然後我將該位圖分成「頁面」進行打印。渲染代碼:

m_Bitmap = new RenderTargetBitmap((int)l_RootTreeViewItem.ActualHeightDesiredSize.Width, 
            (int)l_RootTreeViewItem.ActualHeight, 96, 96, 
            PixelFormats.Pbgra32); 

m_Bitmap.Render(l_RootTreeViewItem); 

適用於小尺寸樹木。如果樹很大,RenderTargetBitmap結果「內存不足」異常。

所以,這個想法是渲染視覺的一部分,以避免內存問題。一個渲染方法,在那裏我可以選擇的視覺呈現將是完美的哪一部分?

m_Bitmap.Render(l_RootTreeViewItem, xOffset, yOffset, width, height); 

...但不存在。有沒有辦法做到這一點?

回答

1

我會做什麼:

  • 創建您l_RootTreeViewItem
  • VisualBrush創建一個Rectangle和視覺刷分配給Fill財產
  • 播放與VisualBrush.ViewboxVisualBrush.Viewport渲染的部分我感興趣的樹形視圖
  • 需要時在我的矩形上使用RenderTargetBitmap.Render

編輯

解決方案2

  • l_RootTreeViewItem在畫布
  • 畫布ClipToBounds屬性設置爲true
  • 播放與Canvas.WidthCanvas.Height性能和Canvas.LeftCanvas.Top附屬屬性僅顯示的一部分
  • 根據需要在畫布上使用PrintDialog.PrintVisual

    <Canvas Width="300" Height="300" ClipToBounds="True"> 
        <TreeViewItem Canvas.Left="-200" Canvas.Top="-100"> 
         ... 
        </TreeViewItem> 
    </Canvas> 
    
+0

感謝尼古拉,你的方法效果。現在我有很多RenderTargetBitmap.Render調用,打印速度很慢,但是是另一個問題(我們需要硬件加速渲染)。 – SBertoli 2012-04-25 14:31:18

+0

你知道你可以直接打印圖像嗎?它更快,看起來更好,因爲它是矢量打印(而不是位圖打印)。 – 2012-04-25 15:10:45

+0

在目前的情況下,我必須使用非WPF報告庫並使用位圖。你在談論WPF(WPS)文檔嗎? – SBertoli 2012-04-26 05:49:24