介紹
WPF 的縮寫指微軟的 Windows Presentation Foundation,而 WinForms 是 Windows Forms Applications 的簡單組合。這兩個都是微軟的 Windows 應用程式圖形使用者介面,開發人員可以使用它們來開發 Windows 桌面應用程式。本文重點介紹兩種開發 Windows 桌面應用程式的方法之間的主要區別,這些方法可以在現代系統開發中發揮更好的作用。
Windows Forms
WinForms 於 2002 年 2 月作為 .NET Framework 的一部分引入。在很大程度上,WinForms 允許開發人員在 Windows 表單上拖放控制項,並允許開發人員使用可以具有 C#、VB.NET 或任何其他 .NET 語言的程式碼後置檔案來操縱這些控制項。每個 WinForms 控制項都是一個類別的實例,因為 WinForms 作為具有一組 C++ 類別的包裝器存在。Microsoft 的 Visual Studio 使 WinForms 的開發更容易,因為開發人員可以輕鬆地從工具箱中拖放控制項。
WinForms 工具箱中的控制項:

在 WinForms 桌面應用程式中,開發人員只能存取他們可以在其中操縱控制項事件的程式碼後置檔案。WinForms 桌面應用程式在控制項的功能和應用程式行為方面有其限制,這將在下一部分中揭示。
WPF 桌面應用程式
與 WinForms 不同,WPF 的架構包含三個主要元件:a presentation framework, presentation core, and mallcore。WPF 並不完全依賴於標準 Windows 控制項,因此是一種獨立方式。2007 年,Microsoft 引入了 Windows Presentation Foundation(WPF),以交替 WinForms 來進行 .NET Framework 桌面應用程式開發。這一交替帶來了桌面應用程式開發中的許多變化。首先,WPF 將設計人員和程式設計師分開,可以使用 Visual Studio 或 Blend 分別設計 UI,而開發人員可以使用程式碼後置檔案來操縱控制項事件。
WPF 使用 XAML 建立控制項,其檔案結構更像 ASP.NET,您可以自由使用設計工具或編寫 XAML 程式碼來建立控制項。使用 Canvas Panel 的設計師仍然可以像在 WinForms 中一樣在 Windows 頁面上拖放控制項。WPF 帶來的主要區別是 XAML 檔案和對 XAML 檔案附帶的可見設計工具的存取。
WPF 可視化設計和 XAML 檔案編輯:

上圖顯示了 WPF 應用程式的佈局,其中在 Designer 旁邊顯示了 XAML 檔案。
WPF 專案的檔案結構如下:

- 每個視窗或頁面都有一個用於加入控制項的 .xaml 檔案以及一個 .cs、.vb 等檔案,後者是程式碼後置檔案,更像是 ASP.NET 方式。
- 與 WinForms 不同,WPF 產生一個初始 MainWindow 來啟動應用程式,而要變更啟動視窗,可以在 App.xaml 檔案中執行此操作。
WPF 主表單啟動配置:

- 該檔案充當應用程式的進入點。
WPF 與 WinForms 的其他顯著區別是控制項。要加入控制項,您只需要編寫簡單的 XAML 程式碼。例如,要在 WPF 視窗中加入文字框,你可以寫如下程式碼實現:
<Window
x:Class="WpfApp1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApp1"
mc:Ignorable="d"
Title="MainWindow"
Height="450"
Width="800"
>
<StackPanel>
<TextBox></TextBox>
</StackPanel>
</Window>
請注意語法中的標記,該標記建議使用名稱「延伸應用程式標記語言(XAML)」。XAML 程式碼放置在 Window 標記中。控制項標籤可能具有描述控制項寬度、高度等的屬性,具體取決於控制項。
WPF 還帶來了與 WinForms 的另一個顯著區別,那就是可以加入帶有影像的 Button 的功能。在 WinForms 中,向按鈕加入影像意味著必須自己繪製影像或包含一些第三方控制項,但是 WPF 按鈕控制項很簡單,您可以向其中加入任何內容。
<Window
x:Class="WpfApp1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApp1"
mc:Ignorable="d"
Title="MainWindow"
Height="500"
Width="800"
>
<button Padding="5">
<StackPanel Orientation="Horizontal">
<image Source="/Image.jpg" Height="25" Width="50" />
<TextBlock Margin="5,0">I'm a Button</TextBlock>
</StackPanel>
</button>
</Window>
輸出如下所示:WPF 執行示範

WPF 還提供了完全支援的資料繫結功能,如下面的範例所示:
<Window
x:Class="WpfApp1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApp1"
mc:Ignorable="d"
Title="MainWindow"
Height="500"
Width="800"
>
<StackPanel Margin="10">
<WrapPanel Margin="0,10">
<label Content="Your Text Here:" FontWeight="Bold" />
<TextBox
Name="txtBind"
Height="20"
Width="250"
RenderTransformOrigin="-2.75,0.587"
Margin="59,0,336,0"
/>
</WrapPanel>
<WrapPanel Margin="0,10">
<TextBlock Text="Bound-Text: " FontWeight="Bold" />
<TextBlock Text="{Binding Path=Text, ElementName=txtBind}" />
</WrapPanel>
</StackPanel>
</Window>
輸出:WPF 資料繫結示範

上例中的 屬性用於將 <TextBlock> 中的文字繫結到 txtBindTextBox 中的文字。這只是說明使用 屬性在 WPF 中繫結資料有多麼簡單。
結論
本文透過兩種建立桌面應用程式的 .NET 方式之間的架構、語法、檔案結構以及應用程式行為差異,展示了 WinForms 和 WPF 之間的主要差異。儘管 WinForms 設計看似友好且直接,但是 XAML 帶來了開發人員在現代桌面應用程式中可能需要的一些有用功能。
原文連結:https://www.c-sharpcorner.com/article/wpf-vs-winforms/