WPF RenderTargetBitmap 缺少元素

标签 wpf rendertargetbitmap

我有一个带有小图标的 TreeView 显示在数据模板中。我正在尝试使用 RenderTargetBitmap 将 Treeview 保存为 PNG。

图像在小数据集上正确保存。但是,如果数据集变得太大,则某些图标会从最终图像中排除。神奇的数字似乎是 200 项。树是深还是宽似乎无关紧要,在 200 个项目之后,不会呈现图标。

添加代码

所以这是我用来创建图像的代码。

        RenderTargetBitmap targetBitmap = new RenderTargetBitmap(
            (int)_treeView.ActualWidth,
            (int)_treeView.ActualHeight,
            96, 96, PixelFormats.Default);

        targetBitmap.Render(_treeView);

添加屏幕截图

请注意树右侧缺少的图标。
Screen shot of missing icons

现在,如果我折叠一些分支,从而隐藏一些其他图标,那么这些图标将被包括在内。这几乎就像 RenderTargetBitmap.Render 没有渲染所有图标的能力。或者它可能与虚拟面板有关。
Screen shot of included icons

这是仔细观察。
enter image description here

最佳答案

我立即注意到你有巨大的形象。宽度 12000。我很惊讶你竟然这么近。

正如 MSDN 所述,纹理宽度/高度受 DirectX 纹理限制。

XAML 可视化树的最大渲染大小受 Microsoft DirectX 纹理的最大尺寸限制;有关更多信息,请参阅资源限制 (Direct3D)。此限制可能因应用程序运行所在的硬件而异。超过此限制的非常大的内容可能会被缩放以适应。如果以这种方式应用缩放限制,则可以使用 PixelWidth 和 PixelHeight 属性查询缩放后的渲染大小。例如,一个 10000 x 10000 像素的 XAML 可视化树可能会缩放到 4096 x 4096 像素,这是应用运行所在硬件强制实现的特定限制的示例。
http://msdn.microsoft.com/library/windows/apps/dn298548

我怀疑这些事情:

  • 虚拟化切断了一些东西 - 我过去曾遇到过 DataGrid 的确切问题,问题是虚拟化。你的情况似乎不像一个。
  • 太大的纹理会导致未定义的行为。

  • 您可以尝试禁用硬件加速。这件事导致了相当多的核心错误。 http://msdn.microsoft.com/en-us/library/system.windows.media.renderoptions.processrendermode.aspx

    除此之外 - 这会很棘手,但我很确定它会很好地工作:

    1) 从根对象开始,递归遍历根对象的子对象,直到找到小于 1000 x 1000 的对象。使用 RenderTargetBitmap(BMP) 对其进行拍照并将其合并到 IN-MEMORY-BMP。为每个 child 做。

    你应该能够计算所有这些东西。

    关于WPF RenderTargetBitmap 缺少元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15369015/

    相关文章:

    c# - ListView 滚动到最后一项 WPF C#

    c# - 动态调整 UserControl 大小的 WPF XAML 数据绑定(bind)

    c# - 如何卡住无法卡住的可卡住对象

    c# - RenderTargetBitmap 和 Viewport3D - 质量问题

    c# - Prism + Modules 使用 WCF 作为数据访问层

    c# - 以编程方式禁用 Windows 7 上的虚拟键盘?

    c# - MVVM:从头到尾的教程?

    c# - 在 UWP 中使用 RenderTargetBitmap 时出错

    wpf - Windows 更新 KB4040972/73 导致 WPF 类出现黑色图像