由于System.Windows.Point / System.Drawing.PointF的区别,在WPF / Silverlight和GDI +之间共享库时出现问题

时间:2011-08-05 20:16:20

标签: c# wpf winforms silverlight gdi+

在我正在进行的项目中http://sourcecodecloud.codeplex.com/我有一个包含非平凡几何图形的库。布局算法。它们完全独立于图形引擎。

该应用程序最初是为GDI +编写的,现在我要实现它的Silverlight和/或WPF端口。问题是我的所有算法都使用System.Drawing.PointFSizeFRectangleF结构。它们都是基于float的。相应的WPF / Silverlight类是double

问题是,有没有人经历过这个?什么是最好的方式?

  1. 为Size,Point,Rectangle等创建自己的包装器,它可以包装两种变体。
  2. 坚持使用System.Drawing或System.Windows并将其投射到另一个。负面影响是“外星人”集会上不需要的参考。
  3. 其他一些魔法?

4 个答案:

答案 0 :(得分:4)

可能适用的一种方法是使用命名空间别名。您使用别名而不是实际类型和编译器指令在它们之间切换。由于命名空间别名是每个文件,如果代码分布在许多文件上,它可能不合适。

#if GDI
using Point=System.Drawing.Point;
#else
using Point=System.Windows.Point;
#endif

如果您使用var,则可以消除大量检查,强制转换并保持性能。您仍然需要查看获取和返回特定类型的函数,例如Math.Sin e.t.c。

答案 1 :(得分:1)

我使用WPF类型,并使用一些全局(扩展?)方法转换为GDI。它们比Gdi更完整,更明智。缺点是它们是双重的,所以它们更大。但是,凭借我们现在拥有的所有记忆,你不太可能遇到问题。

答案 2 :(得分:1)

我会以Portable Library Tools为基础开始。其中的任何类型都适合在所有项目中使用。对于那里没有的任何类型,我将创建您自己的抽象类型,并实现派生类型,它们分别从每个框架包装相关类型。使用您自己代码中创建的抽象类型。

答案 3 :(得分:1)

我正在开发一个具有大量几何和图形计算的制图/ GIS应用程序。最初我在渲染代码中直接使用GDI +的类PointPointF,但它越来越成为问题,因为我想支持Cairo,SVG,Direct2D和其他图形引擎。所以最后我制作了自己的基于接口的层次结构,比如IPointF2IPointD2IPointD3等。当涉及到性能时,它当然不是完美的,但我不是看看一种更好的方法,让你的算法代码与图形引擎分开。

wrote something on this subject前一段时间。