【问题标题】:How to render (bitmap) only part of a Visual?如何仅渲染(位图)Visual 的一部分?
【发布时间】:2012-04-25 07:12:45
【问题描述】:

我必须打印一个显示的 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" 异常。

因此,我们的想法是只渲染部分视觉效果以避免内存问题。 Render 方法,我可以在其中选择要渲染的视觉效果的哪个部分是完美的...

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

...但不存在。有什么办法吗?

【问题讨论】:

    标签: wpf


    【解决方案1】:

    我会做什么:

    • 为您的l_RootTreeViewItem 创建一个VisualBrush
    • 创建一个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>
      

    【讨论】:

    • 感谢 Nicolas,您的方法有效。现在我有很多 RenderTargetBitmap.Render 调用,打印速度很慢,但这是另一个问题(我们需要硬件加速渲染)。
    • 您知道可以直接打印视觉效果吗?它是矢量打印(而不是位图打印),速度更快,看起来更好。
    • 在当前情况下,我必须使用非 WPF 报告库并使用位图。您说的是 WPF (WPS) 文档吗?
    • 看看System.Windows.Controls.PrintDialog.PrintVisual。它需要一个视觉并打印它。您可以跳过RenderTargetBitmap 传递并直接提交您的“矩形”。相信我,您会看到速度和质量的不同。
    • 是的!又快又好。我觉得分页不会很容易,但我会尝试。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2011-12-07
    • 1970-01-01
    • 2013-12-20
    • 2012-06-20
    • 1970-01-01
    • 1970-01-01
    • 2013-09-21
    • 2014-09-12
    相关资源
    最近更新 更多