Обновление приложения WinForms до WPF
-
19-08-2019 - |
Вопрос
У меня есть побочный проект, который я написал несколько лет назад в WinForms.Чтобы лучше помочь мне изучить WPF, я хотел бы переписать его в WPF.В идеале я хотел бы просто изменить текущий проект, который у меня есть, и переписать пользовательский интерфейс в WPF вместо создания нового проекта.
У меня возникают некоторые проблемы с этим.Я сделал следующее (используя Visual Studio 2008 с пакетом обновления 1):
- Изменен целевой фреймворк с 2.0 на 3.5.
- Добавлены ссылки на PresentationCore, PresentationFramework и WindowsBase.
В этот момент я заметил, что что-то не так.Когда я щелкнул правой кнопкой мыши по проекту и выбрал Добавить | Новый элемент, у меня не было возможности создать окно WPF - единственный класс WPF, который я мог создать, - это пользовательский элемент управления WPF.Поскольку у меня было несколько других проектов WPF, я скопировал App.xaml.* и Window1.xaml.* из этого проекта в свой и обновил их по мере необходимости (в основном просто изменив пространство имен этого проекта на пространство имен моего проекта).
Затем я удалил Program.cs (который ранее содержал основной метод, который отображал основную форму WinForm) и построил проект.Я получил сообщение об ошибке, указывающее на отсутствие основного метода.
Похоже, что внутренне Visual Studio знает, что этот проект на самом деле является приложением WinForms, а не приложением WPF.В проекте WPF (созданном путем выбора "Приложение WPF") в свойствах приложения я могу установить экземпляр класса Application в качестве начального объекта.В моем проекте, преобразованном в 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 .Как только я изменил это, я смог установить свой экземпляр приложения в качестве стартового объекта, и мое приложение запустилось бы.Однако у меня по-прежнему нет возможности создавать какие-либо типы WPF, отличные от пользовательских элементов управления.
Решение
Я не знаю наверняка , что в файле проекта сообщает Visual Studio, какой тип проекта используется, но я предполагаю, что " ProjectTypeGuids " это ключ.
Мои проекты WPF имеют это:
<ProjectTypeGuids>
{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};
{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
</ProjectTypeGuids>
Вот ссылка , которую я нашел, которая описывает руководства и какие проект, который они представляют. Вы заметите, что guid начинается с & Quot; 60DC & Quot; соответствует списку в ссылке для приложений WPF.
Другие советы
Ответ Sailing Judo помог мне преобразовать проект WinForms в WPF, но не описал подробно, что необходимо;
- Откройте
csproj
файл для проекта, который вы хотите преобразовать. - Выполните поиск строки
<ProjectTypeGuids>
- скорее всего, его вообще не будет. Добавьте следующее в тег файла проекта.Если у вас есть несколько
PropertyGroup
теги, используйте тот, который безCondition
атрибут (например,свойства по умолчанию).<ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
Сохранить - если у вас открыт проект, VS попросит перезагрузить проект.
Судя по тому, что я вижу и тестирую, теперь я могу легко добавлять окна WPF и WinForms.Мои старые WinForms также работают без проблем.
К сожалению, нет.
Проекты WPF и Windows Forms не очень совместимы.
- Постарайтесь извлечь как можно больше суетливости логический код в библиотеку классов
- Создайте новое пустое решение
- Добавьте новый проект WPF в решение
- Добавить проект библиотеки классов в решение
- Установите библиотеку классов в качестве зависимости от проекта WPF
- Воссоздайте Windows в WPF заново
Надеюсь, это сработает у вас.
Желаю удачи в этом начинании!