将WinForms应用程序升级为WPF

16
我有一个几年前用WinForms编写的副业项目。为了更好地帮助我学习WPF,我想在WPF中重写它。理想情况下,我想修改当前的项目并将UI改为WPF,而不是创建新项目。
我在进行以下操作时遇到了一些问题(使用Visual Studio 2008 SP1):
1. 将目标框架从2.0更改为3.5。 2. 添加PresentationCore、PresentationFramework和WindowsBase引用。
此时,我注意到问题出现了。当我右键单击该项目并选择添加|新项时,我没有一个选项来创建WPF窗口,我只能创建WPF用户控件。由于我的周围还有其他WPF项目,所以我将App.xaml.*和Window1.xaml.*从那个项目复制到了我的项目中,并根据需要更新了它们(基本上只是将该项目的命名空间更改为我的项目的命名空间)。
然后,我删除了Program.cs(以前包含显示主WinForm表单的Main方法),并构建了该项目。我收到了一个错误,指示没有Main方法。
看起来在内部Visual Studio知道这个项目实际上是一个WinForms应用程序,而不是WPF应用程序。在WPF项目中(通过选择“WPF应用程序”创建),在应用程序属性中,我可以将Application类的实例设置为启动对象。在我转换成WinForms的项目中,这不是一个选项。
我快速查看了文本编辑器中的.csproj文件,但我找不到任何可以告诉Visual Studio该项目实际上是WinForms而不是WPF的内容。
除了创建新项目并替换当前项目之外,我还有什么选择将我的WinForms项目变成“真正”的WPF项目?
<Page Include="App.xaml">
  <Generator>MSBuild:Compile</Generator>
  <SubType>Designer</SubType>
</Page>

但是,在我的另一个WPF项目中,它是一个ApplicationDefinition。一旦我改变了它,我就可以将我的应用程序实例设置为启动对象,然后我的应用程序将运行。不过,我仍然没有创建除用户控件之外的任何WPF类型的选项。

5个回答

30

我不确定项目文件中的哪个部分告诉 Visual Studio 正在使用什么类型的项目,但我的猜测是 "ProjectTypeGuids" 是关键。

我的 WPF 项目有这个:

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

我发现了一个链接,其中描述了GUID及其所代表的项目类型。你会注意到,以“60DC”开头的GUID与链接中列出的WPF应用程序列表匹配。


我的项目没有ProjectTypeGuids标签,但是当我从另一个具有与您相同Guid的项目中添加它们时,这足以告诉VisualStudio现在这是一个WPF项目。谢谢! :) - Andy
2
这里有另一个链接,详细描述了如何将Winforms项目转换为WPF项目。我刚刚测试过,看起来非常不错。http://www.mobilemotion.eu/?p=1537&lang=en - Andrea Antonangeli

25

Sailing Judo的回答对我有用,成功将WinForms项目转换为WPF,但没有详细说明需要哪些步骤;

  1. 打开要转换的项目的csproj文件。
  2. 搜索字符串<ProjectTypeGuids> - 很可能不存在。
  3. 在项目文件的PropertyGroup标签中添加以下内容。如果您有多个PropertyGroup标签,请使用没有Condition属性的标签(例如默认属性)。

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

  4. 保存 - 如果您已经在VS中打开了该项目,则会提示重新加载该项目。

从我的测试结果来看,现在我可以轻松地添加WPF窗口和WinForms窗口。我的旧WinForms也可以正常工作。


2
打开项目清单文件(扩展名为.csproj),并将PropertyGroup节点(没有Condition元素的节点)修改如下:
  <PropertyGroup>
     <ProjectTypeGuids>
         {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
     </ProjectTypeGuids>
  </PropertyGroup>

在进行此修改后,请重新启动VS。现在您可以添加WPF窗口或其他WPF元素。您可能还需要添加引用System.Xaml、PresentationCore和PresentationFramework。


1

很遗憾,不行。

WPF和Windows Forms项目并不是非常兼容。

  • 尝试将尽可能多的繁琐逻辑代码提取到类库中
  • 创建一个新的空白解决方案
  • 向解决方案添加一个新的WPF项目
  • 将类库项目添加到解决方案中
  • 将类库设置为WPF项目的依赖项
  • 在WPF中重新创建窗口

希望这对你有用。

祝你好运!


虽然这样做是可行的,而且我很遗憾地倾向于走这条路线,但是 Visual Studio 必须知道这是一个 WinForms 项目,而另一个项目是 WPF 项目。它是如何知道这一点的? - Andy
适当地在项目文件中做些调整,但我不确定。 - Norbert B.

0
将以下代码添加到您的 csproj 文件中:
<ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>

项目类型 GUID:

Windows (C#)           {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
Windows (VB.NET)       {F184B08F-C81C-45F6-A57F-5ABD9991F28F}
Windows (Visual C++)   {8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}
Web Application        {349C5851-65DF-11DA-9384-00065B846F21}
Web Site               {E24C65DC-7377-472B-9ABA-BC803B73C61A}
WCF                    {3D9AD99F-2412-4246-B90B-4EAA41C64699}
WPF                    {60DC8134-EBA5-43B8-BCC9-BB4BC16C2548}
XNA (Windows)          {6D335F3A-9D43-41b4-9D22-F6F17C4BE596}
XNA (XBox)             {2DF5C3F4-5A5F-47a9-8E94-23B4456F55E2}
XNA (Zune)             {D399B71A-8929-442a-A9AC-8BEC78BB2433}
Silverlight            {A1591282-1198-4647-A2B1-27E5FF5F6F3B}
ASP.NET MVC            {F85E285D-A4E0-4152-9332-AB1D724D3325}
ASP.NET MVC 4          {E3E379DF-F4C6-4180-9B81-6769533ABE47}
Test                   {3AC096D0-A1C2-E12C-1390-A8335801FDAB}
Solution Folder        {2150E333-8FDC-42A3-9474-1A3956D46DE8}   

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接