如何渲染(位图)只是Visual的一部分?

时间:2012-04-25 07:12:46

标签: wpf

我必须打印一个显示的TreeView。

将根TreeViewItem呈现为位图,为我提供了整个(甚至是不可见节点)树的图像。然后我在“页面”中拆分位图进行打印。渲染代码:

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

m_Bitmap.Render(l_RootTreeViewItem);

适用于小型树木。如果树很大, RenderTargetBitmap 会导致“Out of Memory”异常。

因此,我们的想法是只渲染部分视觉内容以避免内存问题。一个渲染方法,我可以选择要渲染的视觉部分将是完美的......

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

......但不存在。有没有办法做到这一点?

1 个答案:

答案 0 :(得分:1)

我会做什么:

  • 创建VisualBrush
  • l_RootTreeViewItem
  • 创建Rectangle并将可视画笔分配给Fill属性
  • 使用VisualBrush.ViewboxVisualBrush.Viewport来渲染我感兴趣的树视图部分
  • 在需要时在我的矩形上使用RenderTargetBitmap.Render

修改

解决方案2

  • l_RootTreeViewItem放入画布
  • 将画布的ClipToBounds属性设置为true
  • 使用Canvas.WidthCanvas.Height属性和Canvas.LeftCanvas.Top附加属性进行游戏,仅显示TreeViewItem
  • 的一部分
  • 根据需要在画布上使用PrintDialog.PrintVisual

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