WPF与WinForms
Windows Presentation Foundation(WPF)和Windows Forms Applications(WinForms)是图形用户界面,开发者可以用它们来构建Windows桌面程序。
在本教程中,我们将使用WPF和WinForms创建应用程序,以了解它们的相似性和差异。
前提条件
要跟上本教程,你需要。
- 对C#有一定的了解。
- 安装了[Visual Studio]。
什么是WinForms?
在2002年2月,微软宣布WinForms是一个基于GUI的替代.NET
Framework。
WinForms使开发人员能够将控件拖放到Windows Form上,并使用C#、VB.NET或任何其他*.NET*语言编写的代码来修改这些组件。
由于WinForms是一个C++类集合的包装,每个WinForms控件都是该类的一个实例。
开发人员可以从微软的Visual Studio IDE的工具箱中快速拖放控件。这使得使用WinForms的工作变得简单。
因此,WinForms是.NET框架中的一个图形库,可以让开发者用事件驱动的设计来构建丰富的客户端应用程序。
创建一个WinForms应用程序
假设我们已经安装了Visual Studio,我们可以在解决方案资源管理器中创建一个新的项目,从列表中选择WinForms应用程序。
你可以根据你的需要改变表单的名称。在我们的例子中,它将保持为Form1.cs
。
创建项目后,你会注意到Visual Studio创建了Form1.cs
文件并生成了Program.cs
文件。
从我们的工具箱窗口,我们可以拖放一个文本框、标签和按钮。
通过双击添加按钮,让我们加入以下代码。
private void button1_Click(object sender, EventArgs e)
{
var y = Convert.ToInt32(textBox1.Text);
var x = Convert.ToInt32(textBox2.Text);
var z = y + x;
textBox3.Text = z.ToString();
}
从上面的代码中,我们已经声明了两个变量,它们接受两个输入,将它们相加,然后在一个文本框中显示结果。
在接受输入时,我们必须将字符串转换为整数。
当我们运行应用程序时,它提示输入两个数字,点击添加按钮后,显示结果。
控件在Windows窗体中很容易被采用,这使得它们易于使用。然而,在设计时,不应该利用Windows窗体。
这是因为WinForms中每个事件和过程的代码都与UI元素紧密相连。
即使你利用了WinForms中的可视化设计器,你的表单的设计器扩展组件也有以你选择的语言生成的布局代码。例如,C#,VB.NET,或C++。
如果没有这些代码,你就无法单独构建表单。这意味着,要创建UI,你必须熟悉所选的语言。
什么是WPF?
微软在2007年推出了Windows Presentation Foundation(WPF),它取代了Windows Form。从那时起,桌面应用程序的创建发生了很大的变化。
WPF允许开发者创建事件驱动的富客户端应用程序,在Windows操作系统上使用。
WPF可以用于开发和设计Windows应用程序和Web应用程序,而WinForms只能用于开发和设计Windows应用程序。
XAML(可扩展应用标记语言)被WPF用来定义WPF应用程序的用户界面。XAML是一种声明性的语言,描述了WPF应用程序的用户界面。
在WPF中,用户界面和代码可以被单独创建和组织。WPF中的用户界面是基于XAML的,它是可扩展的,允许你设计一个特定的界面,而不知道它是用C#还是VB.NET编写的。
因此,完整的UI设计可以(但不是必须)由不熟悉编程语言的人完成。
WPF带有对广泛的视频格式、记录、3D材料和大量内置动画的支持,而与WPF相比,WinForms并没有提供很多丰富的、互动的、动画的、硬件加速的、矢量的2D和3D功能。
创建一个WPF应用程序
让我们从在解决方案探索器中创建一个新的项目开始。这里,我们将从列表中选择WPF。
Visual Studio为你创建了两个XAML文件(App.xaml
和MainWindow.xaml
)和两个相应的*C#*文件(App.xaml.cs
和MainWindow.xaml.cs
)。
一个WPF应用程序的布局如上图所示,设计器旁边是XAML文件。
WPF和WinForms之间是有区别的。WPF利用XAML来定义WPF应用程序的用户界面,而WinForms提供了对本地windows常用控件库的访问。
请注意,我们可以手动添加一个文本框、标签和按钮到相关的XAML文件。例如,我们可以在WPF中使用以下代码在MainWindow.xaml
文件中添加一个按钮。
<Window x:Class="addingTwoNumbers.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:addingTwoNumbers"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid HorizontalAlignment="Left" Width="815">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="0*"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Button x:Name = "add_click" Content="Add" HorizontalAlignment="Left" Margin="254,217,0,0" VerticalAlignment="Top" Height="35" Width="92" Grid.ColumnSpan="2"/>
</Grid>
</Window>
在现实中,我们也可以将控件拖放到设计器窗口中。相关的XAML文件也会被更新。让我们在XAML文件中添加一个文本框、标签和按钮。
<Window x:Class="addingTwoNumbers.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:addingTwoNumbers"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid HorizontalAlignment="Left" Width="815">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="0*"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<TextBox x:Name = "firstnumber" HorizontalAlignment="Left" Margin="200,113,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="200" Height="34" Grid.ColumnSpan="2"/>
<TextBox x:Name = "secondnumber" HorizontalAlignment="Left" Margin="200,168,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="200" Height="34" Grid.ColumnSpan="2"/>
<Button x:Name = "add_click" Content="Add" HorizontalAlignment="Left" Margin="254,217,0,0" VerticalAlignment="Top" Height="35" Width="92" Grid.ColumnSpan="2"/>
<Label Content="First number" HorizontalAlignment="Left" Margin="104,121,0,0" VerticalAlignment="Top" Grid.ColumnSpan="2"/>
<Label Content="Second Number" HorizontalAlignment="Left" Margin="104,168,0,0" VerticalAlignment="Top" RenderTransformOrigin="0.492,2.809" Grid.ColumnSpan="2"/>
<TextBox x:Name = "result" HorizontalAlignment="Left" Margin="200,293,0,0" Text="Results" TextWrapping="Wrap" VerticalAlignment="Top" Width="200" Height="34" Grid.ColumnSpan="2"/>
</Grid>
</Window>
在WPF中,XAML使得创建和编辑你的GUI变得容易。它还允许在设计者(XAML)和程序(C#)之间进行分工,不像在WinForms中,设计和程序是不分开的。
在WPF中,我们必须为按钮添加一个点击事件处理程序,而在WinForms中,这不是必需的。
当用户选择添加按钮时,用户在上面两个TextBox控件中提供的值的总和应该显示在第三个TextBox控件中。
在按钮事件处理程序中添加以下代码。
using System.Windows;
namespace addingTwoNumbers
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void add_click(object sender, RoutedEventArgs e)
{
int results = Int32.Parse(firstnumber.Text) + Int32.Parse(secondnumber.Text);
result.Text = results.ToString();
}
}
}
与WinForms不同,WPF主要用于创建应用程序的用户界面(UI),并具有许多安全功能。
总结
在本教程中,我们通过在两种情况下创建一个简单的应用程序,了解了WinForms和WPF的主要区别。
以下是WPF相对于Winforms的一些主要优势。
- 改进的图形用户界面
- 更好的动画
- 二维和三维可视化能力
- 网络应用程序的兼容性
- 更快的加速能力
- 跨平台支持
WPF是本地Windows程序最常用的开发平台。因此,你可以用它来创建高质量的应用程序。