WinForms для WPF - Как мы добираемся отсюда?

Есть ли практический способ медленно развивать приложение WinForms в WPF без создания кошмара для поддержки со странными сценариями взаимодействия?

Фоновая информация:

У нас есть большое серое приложение WinForms с линкором, которое в значительной степени используется внутренней группой из примерно 60-75 пользователей. Мы начинаем сталкиваться с местами, где мы можем видеть некоторые преимущества от приложения в WPF, но этого недостаточно, чтобы оправдать большой проект, чтобы полностью переписать его. Все экраны в приложении представляют собой автономные пользовательские элементы управления WinForms, а приложение WinForms - это всего лишь оболочка, которая обрабатывает меню, открывающие/закрывающие формы, предоставляет некоторые общие вспомогательные методы и т.д.

До сих пор лучшая идея, которую мы имели, это конвертировать приложение оболочки в WPF, а затем размещать в нем пользовательские элементы управления WinForms. Мы думали, что с течением времени мы сможем преобразовать пользовательские элементы управления, привязав эти изменения к инициативам, которые имеют достаточную ценность для бизнеса для поддержки дополнительной работы. Меня беспокоит, насколько хорошо работает взаимодействие и как это повлияет на производительность. Я также обеспокоен тем, как мы переходим к новому взгляду на приложение. Казалось бы странным заставить приложение оболочки выглядеть утонченным, а затем иметь в нем старые элементы управления серым серым линком, а также создавать нестандартные приложения оболочки в WPF и делать их похожими на WinForms.

Если один из Caliburn, Prism или другой подобной структуры облегчит переход, мы также сможем изучить эти варианты.

Ответы

Ответ 1

Мы были в аналогичной ситуации и выбрали следующий путь: сначала мы начали размещать несколько окон WPF в оболочке приложения (все еще WinForms). Конечно, была какая-то заметная разница, но мы сознательно уменьшили разницу, уменьшив количество новых окон. Мы полагали, что к тому времени, когда мы конвертируем оставшиеся окна/элементы управления, будет легче "обновить" до более яркого опыта, так как пользовательский интерфейс будет полностью WPF, и мы можем привлечь графического дизайнера для работы с их магией на основе XAML.

Теперь мы достигли точки, где большинство окон - WPF. Мы начали процесс преобразования приложения оболочки WinForms в приложение оболочки на основе WPF, в котором размещены остальные WinForms. У нас есть несколько тусклых цветов, но пользователи начали замечать разницу, и хотя она небольшая, нашим пользователям по-прежнему нравится постепенное положительное изменение. Не слишком долго, и мы удалим последний WinForm. Это будет тот момент, когда мы дадим нашим графическим дизайнерам от поводок!

Что касается производительности: я, конечно же, не могу сделать общий вывод, поскольку он сильно зависит от ваших конкретных элементов управления/окон. В нашем продукте (несколько сотен окон) мы не обнаружили существенной проблемы с производительностью, связанной с сочетанием WPF и WinForms.

Мы не рассматривали ни одну из фреймворков, поэтому, боюсь, я не могу комментировать их.

Ответ 2

Отличный вопрос, в настоящее время большая часть работы в WPF связана с преобразованием старого приложения WinForms в WPF. По моему мнению, наилучшим сценарием является создание приложения с нуля на основе старого приложения/требований. К счастью, я был частью проекта, в котором мы переписали приложение с нуля, и я уверен, что потребовалось меньше времени/инвестиций, а затем их было смешать.

Я лично считаю, что это создало бы беспорядок, если бы мы попытались смешать их. Другим моментом является то, что будет сложно проектировать смешанное приложение эффективно.

В моем текущем проекте (который представляет собой огромный проект за последние 10 лет) мы преобразуем модуль приложения по модулю. К счастью для нас наше приложение состоит из различных небольших приложений, поэтому проще их конвертировать по одному. В вашем случае я бы сказал, что вы определяете области, которые можно полностью преобразовать в WPF и начать создавать их в WPF, как это предлагается здесь -

Windows Forms - FAQ по совместимости WPF: http://windowsclient.net/learn/integration.aspx

Я бы также предложил использовать некоторые инструменты для преобразования форм Windows в XAML (WPF); это наверняка поможет вам сэкономить некоторое время.

Windows Forms для конвертера WPF: http://wf2wpf.codeplex.com/

Windows Forms to XAML Converter: http://www.ingeniumsoft.com/Products/WinForm2XAML/tabid/63/language/en-US/Default.aspx

Windows Forms для Windows Presentation Конвертер: http://www.spiderwan.com/spiderwan/ConvertWinFormToWPF/WinFormToWPF.aspx