.net - 将 WinForms 应用程序升级到 WPF

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

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

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

  • 将目标框架从 2.0 更改为 3.5。
  • 添加了 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。一旦我改变了它,我就可以将我的 Application 实例设置为启动对象,我的应用程序就会运行。不过,我仍然没有创建用户控件以外的任何 WPF 类型的选项。

    最佳答案

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

    我的 WPF 项目有这个:

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

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

    关于.net - 将 WinForms 应用程序升级到 WPF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/450377/

    相关文章:

    c# - DataGridView Winforms 填充 ComboBoxCell

    c# - 客户端或服务器端的数据处理

    .NET SmtpClient : Is there a way to make sure that all emails resolve prior to sending MailMessage?

    .net - 我需要一个与 StringBuilder 类一起使用的不区分大小写的 Replace 方法

    c# - 在父表单 Dispose() 之后访问控件的 Text 属性?

    c# - 如何使用 Windows 窗体应用程序 C# 在母版页中设置背景图像?

    c# - 在 Windows 7 下创建新文件和目录时,我的代码会导致崩溃吗?

    c# - 如何自动将字符串数组绑定(bind)到 WPF DataGrid?

    c# - 使用 MVVM 将命令绑定(bind)到 DataTemplate 中的控件

    c# - 如何设置Excel窗口的大小?