Проблема совместного использования библиотеки между WPF / Silverlight и GDI + из-за разницы System.Windows.Point / System.Drawing.PointF - PullRequest
4 голосов
/ 06 августа 2011

В проекте, над которым я сейчас работаю http://sourcecodecloud.codeplex.com/ У меня есть библиотека, содержащая нетривиальные алгоритмы геометрии и компоновки. Они полностью независимы от графического движка.

Приложение изначально было написано для GDI +, теперь я собираюсь реализовать его порт Silverlight и / или WPF. Проблема в том, что все мои алгоритмы используют структуры System.Drawing.PointF, SizeF, RectangleF. Все они основаны на float. Соответствующие классы WPF / Silverlight: double.

Вопрос в том, есть ли у кого-нибудь опыт по этому поводу? Какой самый лучший способ?

  1. Создайте собственные обертки для Size, Point, Rectangle и т. Д., Которые могут обернуть оба варианта.
  2. Придерживайтесь либо System.Drawing, либо System.Windows и приведите его к другому. Негативное воздействие - ненужная ссылка на «инопланетную» сборку.
  3. Какая-то другая магия?

Ответы [ 4 ]

4 голосов
/ 06 августа 2011

Один из возможных методов - использовать псевдонимы пространства имен.Вы используете псевдоним вместо фактического типа и директивы компилятора для переключения между ними.Поскольку псевдонимы пространства имен для каждого файла могут быть неподходящими, если код распределен по множеству файлов.

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

Если вы используете var, вы можете устранить множество проверок, приведений и сохранить производительность,Вам по-прежнему нужно смотреть на функции, которые принимают и возвращают определенные типы, такие как Math.Sin и т. Д.

1 голос
/ 06 августа 2011

Я занимаюсь разработкой картографического / ГИС-приложения с большим количеством геометрических и графических расчетов.Первоначально я использовал классы GDI +, такие как Point и PointF, непосредственно в коде рендеринга, но это все больше становилось проблемой, потому что я хотел поддерживать Cairo, SVG, Direct2D и другие графические движки.В итоге я создал собственную иерархию на основе интерфейса, такую ​​как IPointF2, IPointD2, IPointD3 и т. Д. Конечно, она не идеальна, когда дело касается производительности, но я не вижу лучшего способа сохранитьВаш алгоритмический код отделен от графического движка.

Я написал что-то на эту тему некоторое время назад.

1 голос
/ 06 августа 2011

Я бы начал с Portable Library Tools в качестве базы.Любые типы там подходят для использования во всех ваших проектах.Для любых типов, которых там нет, я бы создал ваши собственные абстрактные типы и реализовал производные типы, которые обертывают соответствующий тип из каждой среды отдельно.Используйте как можно больше абстрактных типов из собственного кода.

1 голос
/ 06 августа 2011

Я бы использовал типы WPF и использовал какой-то глобальный (расширение?) Метод для преобразования в GDI. Они более полные и более разумные, чем Gdi. Недостатком является то, что они двойные, поэтому они больше. Но, несмотря на всю эту память, в настоящее время у вас вряд ли возникнут проблемы с этим.

...