Обновление приложения WinForms до WPF - PullRequest
14 голосов
/ 16 января 2009

У меня есть побочный проект, который я написал несколько лет назад в WinForms. Чтобы лучше помочь мне изучить WPF, я хотел бы переписать его в WPF. В идеале я хотел бы просто изменить текущий проект и переписать пользовательский интерфейс в WPF вместо создания нового проекта.

У меня проблемы с этим. Я сделал следующее (с помощью Visual Studio 2008 SP1):

  1. Изменена целевая платформа с 2.0 на 3.5.
  2. Добавлены ссылки на PresentationCore, PresentationFramework и WindowsBase.

В этот момент я заметил, что что-то не так. Когда я щелкнул правой кнопкой мыши по проекту и выбрал Add | Новый элемент, у меня не было возможности создать окно WPF - единственный класс WPF, который я мог создать, - это пользовательский элемент управления WPF. Поскольку у меня были некоторые другие проекты WPF, я скопировал App.xaml. * И Window1.xaml. * Из этого проекта в мой и обновил их по мере необходимости (в основном просто меняя пространство имен этого проекта на пространство имен моего проекта).

Затем я удалил Program.cs (который ранее содержал метод Main, который отображал основную форму WinForm) и собрал проект. Я получил сообщение об ошибке, указывающее, что метод Main отсутствует.

Кажется, внутренне Visual Studio знает, что этот проект действительно является приложением WinForms, а не приложением WPF. В проекте WPF (созданном путем выбора «Приложение WPF») в свойствах приложения я могу установить экземпляр класса приложения в качестве объекта запуска. В моем конвертированном проекте WinForms это не вариант.

Я быстро взглянул на файл .csproj в текстовом редакторе, но не смог найти ничего, что могло бы сказать Visual Studio, что проект действительно WinForms, а не WPF.

Что еще мне нужно сделать, чтобы превратить мой проект WinForms в "настоящий" проект WPF? У меня есть другой вариант, кроме создания нового проекта и просто замены моего текущего проекта?

Обновление: Я внимательно посмотрел на файлы .csproj и заметил, что App.xaml был добавлен как страница:

<Page Include="App.xaml">
  <Generator>MSBuild:Compile</Generator>
  <SubType>Designer</SubType>
</Page>

Однако в моем другом проекте WPF это ApplicationDefinition. Как только я изменил это, я мог установить свой экземпляр Application в качестве объекта запуска, и мое приложение запустилось. У меня все еще нет возможности создавать какие-либо типы WPF, кроме пользовательских элементов управления.

Ответы [ 3 ]

28 голосов
/ 16 января 2009

Я не знаю для определенного , что в файле проекта сообщает Visual Studio, какой тип проекта используется, но я предполагаю, что ключ "ProjectTypeGuids" является ключевым.

Мои проекты WPF имеют это:

<ProjectTypeGuids>
   {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};
   {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
</ProjectTypeGuids>

Вот ссылка Я нашел, что описывает гидов и какой проект они представляют. Вы заметите, что guid, начинающийся с "60DC", соответствует списку в ссылке для приложений WPF.

23 голосов
/ 29 апреля 2009

Ответ Sailing Judo помог мне преобразовать проект WinForms в WPF, но не описал подробно, что нужно;

  1. Откройте файл csproj для проекта, который вы хотите преобразовать.
  2. Поиск строки <ProjectTypeGuids> - скорее всего, ее не будет.
  3. Добавьте следующее в тег файла проекта. Если у вас есть несколько тегов PropertyGroup, используйте тег без атрибута Condition (например, свойства по умолчанию).

    <ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>

  4. Сохранить - если у вас открыт проект, VS попросит перезагрузить проект.

Из того, что я вижу и тестирую, теперь я могу легко добавить WPF Windows и WinForms. Мои старые WinForms также работают без проблем.

2 голосов
/ 16 января 2009

К сожалению, нет.

Проекты WPF и Windows Forms не очень совместимы.

  • Постарайся извлечь как можно больше суеты логический код в библиотеку классов
  • Создать новый пустой раствор
  • Добавить новый проект WPF в решение
  • Добавить проект библиотеки классов в решение
  • Установить библиотеку классов как зависимость проект WPF
  • Воссоздание окон в WPF

Надеюсь, это работает для вас.

Желаем удачи в этом начинании!

...