none
请指点一下wpf的绘图思路 RRS feed

  • 问题

  • 刚开始学习了解wpf。碰到了一些问题,请大家指点一下思路

    wpf的绘图机制我不太了解,想实现这么一个功能:

    类似监护仪的图形显示那样,画一些线条,是需要一直更新的。

    我会用gdi+绘制,流程是先获取一个绘图控件区域的上下文,比如从panel创建一个graphics,每隔一个时间点(比如20ms),绘制一次,graphics.drawline(pen,x_old,y_old,x_new,y_new),每个时间点获取到x_new,y_new坐标。这样从左往右绘制,每次只绘制最右侧的一点,前面的没有擦除依然能显示。

    wpf里我不太会,尝试了下drawvisual,但是不太会如何实现。

    drawvisual绘制,是不是每次更新时,都必须把之前的图形全部重新画一次?

    2014年3月3日 16:09

答案

  • 你好,

    你的理解是正确的。

    我推荐两篇关于WPF Real-Time的文章给你吧,都是用来绘制实时图像的。

    你好,大致估算一下的话,按100Hz的频率更新Bmp,不细致指定更新区域矩形的情况下,writeablebitmap刷新到屏幕上显示,能更新得过来吗?

    像这类需要高频率绘图刷新的,是不是应该放弃wpf,选择winform作ui层的解决办法了?

    我从最开始回答的时候就没推荐过这种方式,最优的方式也不是选择 winform,而是 GDI 或 DirectX。

    你需要自己去评估,写三个对比实例,然后按照你们的需求来评估资源消耗和性能是否在可接受范围内。

    2014年3月6日 8:55

全部回复

  • http://social.msdn.microsoft.com/Forums/zh-CN/febcee07-dc8b-44b4-8c0a-246daffdbe2b/wpf-?forum=wpfzhchs

    读了这篇帖子后,我有了一个思路:

    通过wpf自己的绘图来实现这种动态更新频率高的图形,是不太可行的。

    一个可行的做法:

    gdi+在内存bmp上绘图,把bmp对象绑定到wpf的显示界面上,来进行同步更新显示。

    不知道这么理解对不对?

    2014年3月4日 1:07
  • 你理解的是正确的。
    2014年3月4日 2:50
  • 你好,

    你的理解是正确的。

    我推荐两篇关于WPF Real-Time的文章给你吧,都是用来绘制实时图像的。

    http://www.mesta-automation.com/real-time-line-charts-with-wpf-and-dynamic-data-display/

    http://blog.bartdemeyer.be/2013/03/creating-graphs-in-wpf-using-oxyplot/

    谢谢!


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2014年3月4日 8:10
    版主
  • 谢谢大家的提示,谢谢 Jimmy Yang - MSFT的文章链接
    2014年3月4日 16:13
  • 不是很熟悉怎么使用GDI+在内存BMP上绘图然后在把BMP对象帮顶到WPF的显示界面上进行同步的更新显示,请问哪里可以有点参考呢?
    2014年3月5日 9:00
  • 不是很熟悉怎么使用GDI+在内存BMP上绘图然后在把BMP对象帮顶到WPF的显示界面上进行同步的更新显示,请问哪里可以有点参考呢?

    Jimmy Yang - MSFT有一个例子代码,我看了下,是创建一个writeablebitmap对象,把这个对象给wpf控件去显示,然后通过gdi+的bitmap从writeablebitmap上创建出来一个system.drawing.bitmap对象,使用gdi+在bitmap对象上绘图,绘制完成后,writeablebitmap再unlock缓冲显示到wpf控件界面上去。

    不过我有些gdi+上绘图的难题。

    winfrom中我可以设置控件背景为背景图,这样绘图擦除时就不会擦掉背景。可以只绘制上面变换的图像就可以了。

    但是在bitmap上绘制的话,没法通过设置背景来固定住不变的背景图,还得想办法每次刷新时绘制背景才行

    2014年3月5日 12:39
  • 你好,

    你的理解是正确的。

    我推荐两篇关于WPF Real-Time的文章给你吧,都是用来绘制实时图像的。

    你好,大致估算一下的话,按100Hz的频率更新Bmp,不细致指定更新区域矩形的情况下,writeablebitmap刷新到屏幕上显示,能更新得过来吗?

    像这类需要高频率绘图刷新的,是不是应该放弃wpf,选择winform作ui层的解决办法了?

    2014年3月6日 8:44
  • 这个你需要看具体情况,如果频率很高,但是我没有经过实际测试呀!WinForm更适合。
    2014年3月6日 8:49
  • 不是很熟悉怎么使用GDI+在内存BMP上绘图然后在把BMP对象帮顶到WPF的显示界面上进行同步的更新显示,请问哪里可以有点参考呢?

    Jimmy Yang - MSFT有一个例子代码,我看了下,是创建一个writeablebitmap对象,把这个对象给wpf控件去显示,然后通过gdi+的bitmap从writeablebitmap上创建出来一个system.drawing.bitmap对象,使用gdi+在bitmap对象上绘图,绘制完成后,writeablebitmap再unlock缓冲显示到wpf控件界面上去。

    不过我有些gdi+上绘图的难题。

    winfrom中我可以设置控件背景为背景图,这样绘图擦除时就不会擦掉背景。可以只绘制上面变换的图像就可以了。

    但是在bitmap上绘制的话,没法通过设置背景来固定住不变的背景图,还得想办法每次刷新时绘制背景才行


    你计算好新增点的位置,然后在上一次绘制的 BMP 上接着绘制。
    2014年3月6日 8:51
  • 你好,

    你的理解是正确的。

    我推荐两篇关于WPF Real-Time的文章给你吧,都是用来绘制实时图像的。

    你好,大致估算一下的话,按100Hz的频率更新Bmp,不细致指定更新区域矩形的情况下,writeablebitmap刷新到屏幕上显示,能更新得过来吗?

    像这类需要高频率绘图刷新的,是不是应该放弃wpf,选择winform作ui层的解决办法了?

    我从最开始回答的时候就没推荐过这种方式,最优的方式也不是选择 winform,而是 GDI 或 DirectX。

    你需要自己去评估,写三个对比实例,然后按照你们的需求来评估资源消耗和性能是否在可接受范围内。

    2014年3月6日 8:55
  • 我从最开始回答的时候就没推荐过这种方式,最优的方式也不是选择 winform,而是 GDI 或 DirectX。

    你需要自己去评估,写三个对比实例,然后按照你们的需求来评估资源消耗和性能是否在可接受范围内。

    谢谢。

    我先尝试下wpf绑定bmp,用gdi+的方式绘制bmp刷新试试看;速度跟不上再换winform用gdi+,这个应该差不多可以了。

    实在不行,再考虑gdi,gdi得用vc了吧,托管代码下调用gdi,是不是效率比gdi+没多大提升?尽量避免用gdi和directx,因为这两个暂时还不会,还得现看资料,嘻嘻。



    2014年3月6日 10:59
  • 我这边的结果是,感觉wpf绑定bmp,还可以接受。毕竟我要求也不高,应该50Hz的刷新就可以了
    2014年3月8日 18:24