【问题标题】:Upgrading a WinForms app to WPF将 WinForms 应用程序升级到 WPF
【发布时间】:2010-10-01 19:28:51
【问题描述】:

我有一个几年前在 WinForms 中编写的副项目。为了更好地帮助我学习 WPF,我想用 WPF 重写它。理想情况下,我只想修改我拥有的当前项目并在 WPF 中重写 UI,而不是创建一个新项目。

我在这样做时遇到了一些问题。我做了以下事情(使用 Visual Studio 2008 SP1):

  1. 将目标框架从 2.0 更改为 3.5。
  2. 添加了 PresentationCore、PresentationFramework 和 WindowsBase 引用。

此时,我注意到有些不对劲。当我右键单击项目并选择添加 |新项目,我没有创建 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。一旦我改变了它,我可以将我的应用程序实例设置为启动对象,我的应用程序就会运行。不过,除了用户控件之外,我仍然没有创建任何 WPF 类型的选项。

【问题讨论】:

    标签: .net wpf winforms visual-studio-2008 upgrade


    【解决方案1】:

    我不知道确定项目文件中的哪些内容会告知 Visual Studio 正在使用哪种类型的项目,但我猜“ProjectTypeGuids”是关键。

    我的 WPF 项目有这个:

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

    Here is a link 我发现它描述了 guid 以及它们代表的项目类型。您会注意到以“60DC”开头的 guid 与 WPF 应用程序链接中的列表相匹配。

    【讨论】:

    • 我的项目没有 ProjectTypeGuids 标签,但是当我从另一个项目(与您的 Guid 相同)添加它们时,这足以告诉 VisualStudio 现在这是一个 WPF 项目。谢谢! :)
    • 这里是另一个链接,详细描述了如何将 Winforms 项目转换为 WPF 项目。我刚刚测试了它,看起来真的很棒。 mobilemotion.eu/?p=1537&lang=en
    【解决方案2】:

    Sailing Judo 的回答对我有用,可以将 WinForms 项目转换为 WPF,但没有详细描述需要什么;

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

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

    4. 保存 - 如果您打开了项目,VS 会要求重新加载项目。

    根据我的观察和测试,我现在可以轻松添加 WPF Windows WinForms。我的旧版 WinForm 也可以正常工作。

    【讨论】:

      【解决方案3】:

      遗憾的是没有。

      WPF 和 Windows 窗体项目不是很兼容。

      • 尽量减少烦躁 逻辑代码到类库中
      • 创建一个新的空白解决方案
      • 将新的 WPF 项目添加到解决方案中
      • 将类库项目添加到 解决方案
      • 将类库设置为 WPF 项目
      • 在 WPF 中重新创建窗口

      希望这对你有用。

      祝这项工作好运!

      【讨论】:

      • 虽然这样可行,而且我很遗憾地倾向于走这条路,但不知何故,Visual Studio 必须知道这是一个 WinForms 项目,而另一个项目是 WPF 项目。它是怎么知道的?
      • proj 文件中有正确的内容,但我不确定
      【解决方案4】:

      打开项目清单文件(一个带有.csproj扩展名的文件)并修改PropertyGroup节点(没有Condition元素的那个)如下:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多