Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在WPF中构建CAD程序_C#_Wpf_Performance_Zooming - Fatal编程技术网

C# 在WPF中构建CAD程序

C# 在WPF中构建CAD程序,c#,wpf,performance,zooming,C#,Wpf,Performance,Zooming,-在WPF中构建CAD程序: 我想建立一个CAD程序,一次将有10000个行对象。我正在使用LineGeomery类来绘制添加到Canvas的线条。我已经实现了缩放和平移,到目前为止性能非常好 只有一个主要的失望: 缩放时,线条的厚度将缩放。我已经尝试将线的厚度属性绑定到一个因子,以保持它们不变,这可以工作,但在缩放时会显著降低性能。在mouseweel上清除并绘制具有新厚度的新线条也是不可能的。这种方法也会降低性能,在当前方法中不实用 -现在我有什么解决方案? 坚持当前方法,忽略厚度的变化

-在WPF中构建CAD程序:

我想建立一个CAD程序,一次将有10000个
对象。我正在使用
LineGeomery
类来绘制添加到
Canvas
的线条。我已经实现了缩放和平移,到目前为止性能非常好

只有一个主要的失望:

缩放时,线条的
厚度将缩放。我已经尝试将线的
厚度
属性绑定到一个因子,以保持它们不变,这可以工作,但在缩放时会显著降低性能。在
mouseweel
上清除并绘制具有新厚度的新线条也是不可能的。这种方法也会降低性能,在当前方法中不实用

-现在我有什么解决方案?

  • 坚持当前方法,忽略厚度的变化
  • 在GDI中完成全部工作+
  • WPF中的主机GDI
  • 使用WPF Viewport3D(此处的线宽是否不变?)
其他解决方案?

你还想走什么路。我是WPF和编程新手,我渴望学习

更新:


我现在就是这样做的。我用画笔在视觉层上画了3000条线。然后在MouseWheel事件中,我用更新的厚度重新绘制了所有线条。另外,在用户缩放之前,我不会向用户显示其余的线条,因此在每个鼠标滚轮事件中,我只创建10000条线条中的3000条。

您可以通过路径对象绘制线条,而不是使用线条对象。下面是一个答案

除了在WPF中托管winforms元素之外,我还将在缩放功能上实现部分渲染,例如,当您放大所有不可见的内容时,也不应计算

当对象数为1000+时,使用路径对象会降低性能。下面是另一个示例。。。您可以通过覆盖DefiningGeometry属性来绘制自己的形状。但是缩放可能有点棘手这也不支持缩放:(你试过可缩放的画布吗?你可以把Stkes的厚度与刻度相反,你也考虑过吗?”克莱门斯:是的,实际上我已经做过了,它改进了一些东西。我把刻度的倒数和线的厚度结合起来了。我正在重新画鼠标轮上的线条。我试过你建议的路径方法,但是它也是。缺乏性能。使用视觉层,现在我可以缩放/重画2000-3000条线。你有什么建议吗?我应该使用Viewport3D吗?我在厚度方面也会有同样的问题吗?@Clemens我最后的办法是只重画我需要的部分,并清除视图之外的部分。但在我采取这种做法之前,我想nt检查所有可能的方法。使用DrawingVisual并仅绘制可视部分听起来是一种明智的方法。在WPF中,3000行表示3000多个对象。众所周知,WPF在图形方面速度较慢,特别是当它需要在短时间内重新计算时。到目前为止,还没有解决该特定问题的方法。您会怎么做你的建议是什么?我应该选择4种方法中的哪一种?如果有足够的时间,我会尝试每种方法并进行性能测试。否则我会选择WPF并在容器中托管GDI。问题是我甚至不确定GDI+是否会更快绘制10000+行。你对此有经验吗?关于绘制技术的比较总之,GDI(+)最慢,因为它不使用硬件加速;DirectX最快,因为它使用硬件加速;WPF是DirectX之上的一层,可以启用(网格、流、输入框等)由于WPF速度较慢,因为它使对象更复杂,尺寸更大。结论是使用DirectX,但是这一个需要一些时间来学习。