【问题标题】:What is the best approach to render charts in WPF?在 WPF 中呈现图表的最佳方法是什么?
【发布时间】:2010-08-09 08:29:58
【问题描述】:

渲染图表然后将它们保存在硬盘上以便使用 WPF 进一步分发的最佳方法是什么? 我发现了许多方法可以通过使用以下类型来实现这一点:

  1. DrawingVisual - 创建这种类型的对象,然后在其上下文中渲染图形;
  2. Shape - 派生自 Shape 类,然后在实际渲染发生的位置覆盖其 DefiningGeometry 属性;
  3. PathFigure - 将 LineSegment-s 添加到此类的实例中,然后将此实例添加到 Canvas;
  4. Adorner - 从它派生然后覆盖它的 OnRender 方法;
  5. WritableBitmap - 在其上进行渲染,然后将位图添加到 Canvas。

当然,我要编写一个应用程序来测试每个应用程序的速度。但是谁能告诉我:

  • 我是否走在正确的轨道上?
  • 还有其他方法可以进行这种渲染吗?
  • 其中哪一个是最好的 性能条款?

【问题讨论】:

    标签: wpf rendering


    【解决方案1】:

    这完全取决于您的实际使用情况,在您的情况下,您提到保存在硬盘上以“进一步分发” - 我假设您将它们保存为图像(jpg 或 png)而不是 wpf 对象(xaml)。

    1. 您应该考虑 WPF 是否是适合这项工作的工具,WPF 是一个 UI 框架而不是通用图像处理库,最好完全使用其他东西来生成图像。

    2. 对于合理数量的点,您的性能瓶颈将是对图像进行编码并将其保存到磁盘 - 而不是实际渲染它 - 因此您应该选择更容易编码的方法。

    3. 所有关于高性能 WPF 图表的文章都是 a:关于 10,000 点及以上的图表(因为这是性能问题所在),b:关于您在 GUI 中显示的图表(因为否则您可以使用一个用于创建位图的图像处理库)和 c: 一直在变化的图表(因此它们与数据绑定很好地配合使用)- 他们不谈论将图表保存到磁盘是有原因的。

    4. 对于非常多的点:

      • 在 WPF 中绘制的最快方法是从 FrameworkElement(不是 Adorner)继承并覆盖 OnRender。
      • 当数据经常更改时,建议使用多个 DrawingVisual 对象,因为这样您就不必在一个值更改时重新渲染所有内容 - 但这与您无关,因为图像在您保存后不会更改无论如何。
      • WritableBitmap 用于原始位图访问,当您决定放弃所有漂亮的布局和绘图 WPF 给您时使用它,因为您无法承担开销,如果是这种情况,您应该重新阅读我的上面的第一点。

    因此,总而言之,您问错了问题 :-) 如果您需要将图像保存到磁盘而不是 WPF 渲染速度不是您的瓶颈,或者您不应该从一开始就使用 WPF。如果您确实使用 WPF,只需选择最容易编写代码的即可。

    顺便说一句:装饰器用于在普通 UI 上方显示“浮动”元素,您可以将它们用于类似工具提示的功能,但不能用于主图表渲染(而且您可能根本不需要它们,因为您的主要用途是正在将图像保存到磁盘),FrameworkElement 是您要查找的基类。

    【讨论】:

    • 感谢 Nir,您的回答。读完后,我意识到我问错了问题)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-12
    • 2015-03-22
    • 1970-01-01
    • 2010-12-24
    • 1970-01-01
    • 2015-03-31
    • 1970-01-01
    相关资源
    最近更新 更多