由于System.Windows.Point / System.Drawing.PointF的差异,WPF / Silv
本文关键字:System WPF Silv PointF Windows Point Drawing 由于 | 更新日期: 2023-09-27 18:04:52
在我目前正在http://sourcecodecloud.codeplex.com/工作的项目中,我有一个包含非平凡几何的库&布局算法。它们完全独立于图形引擎。
这个应用程序最初是为GDI+编写的,现在我要实现它的Silverlight和/或WPF端口。问题是我所有的算法都使用System.Drawing.PointF
, SizeF
, RectangleF
结构。它们都是float
基的。对应的WPF/Silverlight类为double
.
问题是,有人有这方面的经验吗?最好的方法是什么?
- 为大小,点,矩形等创建自己的包装器,可以包装这两个变量。
- 坚持与系统。绘图或系统。窗户和铸造它在另一个。负面影响是对"外来"组件不必要的引用。 还有其他魔法吗?
一种可能适用的方法是使用名称空间别名。您可以使用别名代替实际类型,并使用编译器指令在它们之间进行切换。由于名称空间别名是每个文件的,因此如果代码分布在许多文件中,则可能不适合。
#if GDI
using Point=System.Drawing.Point;
#else
using Point=System.Windows.Point;
#endif
如果您使用var
,您可以消除许多检查,强制类型转换并保持性能。您仍然需要查看接受和返回特定类型(如Math)的函数。罪e.t.c。
我将从便携式库工具作为基础开始。其中的任何类型都适合在所有项目中使用。对于没有出现的类型,我将创建您自己的抽象类型,并实现派生类型,这些类型分别包装来自每个框架的相关类型。尽量使用您从自己的代码中创建的抽象类型
我将使用WPF类型,并使用一些全局(扩展?)方法转换为GDI。它们比Gdi更完整、更明智。缺点是它们是双基的,所以它们更大。但是现在我们有这么多的记忆,你不太可能有这个问题。
我正在开发一个具有大量几何和图形计算的制图/GIS应用程序。最初我直接在渲染代码中使用GDI+的类,如Point
和PointF
,但这逐渐成为一个问题,因为我想要支持Cairo、SVG、Direct2D和其他图形引擎。所以最后我制作了自己的基于接口的层次结构,如IPointF2
、IPointD2
、IPointD3
等。当涉及到性能时,它当然不是完美的,但我没有看到更好的方法来保持你的算法代码与图形引擎分开。
我之前写过一些关于这个主题的东西