Dot-Net

將 WinForms 應用程序升級到 WPF

  • March 20, 2020

我有一個幾年前在 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 類型的選項。

不確定項目文件中的哪些內容會告知 Visual Studio 正在使用哪種類型的項目,但我的猜測是“ProjectTypeGuids”是關鍵。

我的 WPF 項目有這個:

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

這是我找到的一個連結,它描述了指南以及它們代表的項目類型。您會注意到以“60DC”開頭的 guid 與 WPF 應用程序連結中的列表相匹配。

Sailing Judo 的回答對我有用,可以將 WinForms 項目轉換為 WPF,但沒有詳細描述需要什麼;

  1. 打開csproj要轉換的項目的文件。
  2. 搜尋字元串<ProjectTypeGuids>- 很可能它不存在。
  3. 在項目文件的標記中添加以下內容。如果您有多個PropertyGroup標籤,請使用沒有Condition屬性的標籤(例如預設屬性)。

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

  1. 保存 - 如果您打開了項目,VS 會要求重新載入項目。

從我看到和測試的結果來看,我現在可以輕鬆添加 WPF WindowsWinForms。我的舊 WinForms 也可以正常工作。

引用自:https://stackoverflow.com/questions/450377