说明:下面基于 .NET 6+(.NET 7/8/9 通用) ,区分三大UI框架,从定位、项目模板、目录结构、运行原理、适用场景、优缺点一次性讲清楚,附带模板命令。
一、总览对比
| 框架 | 全称 | 渲染模式 | 宿主 | 核心用途 |
|---|---|---|---|---|
| WinForms | Windows Forms | GDI+ 原生窗口控件 | Windows桌面 | 传统Windows桌面程序,快速开发工具、管理系统 |
| WPF | Windows Presentation Foundation | DirectX 矢量渲染 | Windows桌面 | 高定制UI、复杂界面、工控/设计类桌面软件 |
| Blazor | Blazor | Web前端渲染 | 浏览器 / WebView / 服务端 | Web应用;也可做桌面(Blazor WebView)、移动端 |
⚠️ 重点:
- WinForms、WPF 只能运行在Windows(.NET Core/.NET5+ 不再支持Linux/macOS原生)
- Blazor 分两种:Blazor Server(服务端) 、Blazor WebAssembly(WASM,客户端) ;还有 Blazor Hybrid(MAUI/WinForms/WPF内嵌WebView)
二、WinForms 模板详解
1. 创建模板命令(CLI)
arduino
# 创建WinForms项目
dotnet new winforms -n MyWinFormsApp
cd MyWinFormsApp
dotnet run
2. 模板项目结构
bash
MyWinFormsApp/
├── MyWinFormsApp.csproj # 项目文件
├── Program.cs # 程序入口(.NET6+ 顶级语句模板)
├── Form1.cs # 主窗体代码(后台逻辑)
├── Form1.Designer.cs # 自动生成:控件布局、InitializeComponent()
└── Form1.resx # 资源文件:图片、字符串、本地化资源
Program.cs(.NET6+ 新版模板,顶级语句)
csharp
namespace MyWinFormsApp;
static class Program
{
[STAThread]
static void Main()
{
ApplicationConfiguration.Initialize();
Application.Run(new Form1()); // 启动主窗体
}
}
[STAThread]是WinForms强制标记:COM组件、窗口消息循环必须单线程单元。
Form1.cs / Form1.Designer.cs
Form1.cs:手写业务逻辑,按钮事件、数据处理Form1.Designer.cs:不要手动修改 ,VS设计器拖拽控件自动生成,里面InitializeComponent()负责实例化所有控件、设置属性、绑定事件。
3. 工作原理
WinForms 封装 Windows API,底层GDI+绘制控件(Button、TextBox、DataGridView等)。
- 消息循环:
Application.Run()启动Windows消息泵,接收鼠标、键盘消息,分发到控件事件。 - 控件是原生Windows控件包装,渲染性能稳定,但样式定制能力弱。
4. 优缺点 & 适用场景
✅ 优点:上手最简单、开发速度快、成熟控件库多(DevExpress、Infragistics),老系统迁移友好 ❌ 缺点:UI老旧,自定义界面困难;仅Windows;高DPI适配坑多 适用:内部管理工具、工控上位机、简单桌面工具、维护老项目
三、WPF 模板详解
1. 创建模板命令
arduino
dotnet new wpf -n MyWpfApp
cd MyWpfApp
dotnet run
2. 项目结构
bash
MyWpfApp/
├── MyWpfApp.csproj
├── App.xaml # 应用程序全局定义:资源字典、启动窗口、全局事件
├── App.xaml.cs # App后台代码
├── MainWindow.xaml # 界面:XAML标记语言(UI描述)
└── MainWindow.xaml.cs # 后台代码(Code-behind)
App.xaml
xml
<Application x:Class="MyWpfApp.App"
xmlns="[http://schemas.microsoft.com/winfx/2006/xaml/presentation](http://schemas.microsoft.com/winfx/2006/xaml/presentation)"
xmlns:x="[http://schemas.microsoft.com/winfx/2006/xaml](http://schemas.microsoft.com/winfx/2006/xaml)"
StartupUri="MainWindow.xaml">
<Application.Resources>
<!-- 全局样式、资源 -->
</Application.Resources>
</Application>
StartupUri 指定启动窗口。
MainWindow.xaml(UI描述)
ini
<Window x:Class="MyWpfApp.MainWindow"
xmlns="[http://schemas.microsoft.com/winfx/2006/xaml/presentation](http://schemas.microsoft.com/winfx/2006/xaml/presentation)"
xmlns:x="[http://schemas.microsoft.com/winfx/2006/xaml](http://schemas.microsoft.com/winfx/2006/xaml)"
Title="MainWindow" Height="450" Width="800">
<Grid>
<Button Content="Hello WPF"/>
</Grid>
</Window>
- XAML:声明式UI,UI与代码分离;支持样式、模板、触发器、动画、矢量绘图。
- 后台
MainWindow.xaml.cs处理事件。
3. WPF核心机制
- 依赖属性(DependencyProperty) :区别普通属性,支持样式绑定、动画、继承
- 数据绑定:UI直接绑定ViewModel(MVVM模式,推荐)
- 渲染底层DirectX:矢量渲染,缩放不失真
- 控件模板 ControlTemplate:可以完全重写控件外观(按钮可以改成圆形图片)
两种开发模式:
-
Code-behind(模板默认):事件写在xaml.cs,简单快速
-
MVVM(生产推荐):UI和业务完全解耦,Prism、CommunityToolkit.Mvvm
4. 优缺点 & 适用场景
✅ 优点:UI高度自定义、矢量、强大绑定、MVVM架构、动画/图形能力强 ❌ 缺点:学习曲线陡峭;仅Windows;启动速度比WinForms慢;内存占用更高 适用:专业桌面软件、可视化大屏、设计工具、复杂交互客户端
四、Blazor 模板详解(重点区分3种模板)
Blazor 不是桌面框架,是基于.NET的WebUI框架,使用Razor语法(融合HTML+C#)。 3个核心模板:
blazorserver→ Blazor Serverblazorwasm→ Blazor WebAssembly (WASM)blazorhybrid→ Blazor Hybrid(桌面/移动端,内嵌WebView,可在WinForms/WPF/MAUI中使用)
1. 模板创建命令
csharp
# Blazor Server
dotnet new blazorserver -n BlazorServerDemo
# Blazor WebAssembly(独立前端)
dotnet new blazorwasm -n BlazorWasmDemo
# Blazor Hybrid
dotnet new blazorhybrid -n BlazorHybridDemo
2. Blazor Server 模板结构
bash
BlazorServerDemo/
├── Pages/ # Razor页面
│ ├── Index.razor # 首页
│ ├── Counter.razor
│ └── FetchData.razor
├── Shared/ # 共享组件
│ ├── MainLayout.razor # 布局
│ ├── NavMenu.razor
├── wwwroot/ # 静态资源:css/js/img
├── App.razor # 根组件
├── Program.cs # 服务启动入口
└── BlazorServerDemo.csproj
原理:
- C#代码运行在服务端
- 浏览器通过SignalR长连接和服务器通信
- 用户操作(点击按钮)发送消息到服务端,服务端重新渲染组件DOM diff,把变更传回浏览器 ✅ 优点:前端不用JS、可以直接访问服务器数据库;首屏加载快 ❌ 缺点:依赖网络;并发连接占用服务器资源;离线不可用
3. Blazor WebAssembly (WASM)
目录结构和Blazor Server很像,但运行位置不一样:
- .NET运行时(wasm格式)下载到浏览器本地
- C#代码在浏览器中执行,不需要持续长连接
- 访问后端API获取数据 ✅ 优点:可离线、部署到静态网站;服务压力小 ❌ 缺点:首屏下载大,启动慢;不能直接访问数据库,只能调用API
4. Blazor Hybrid(混合模式)
Blazor Hybrid = WebView + Blazor组件,不是纯Web 可以宿主于 WinForms / WPF / MAUI。
- 界面依旧写Razor组件,打包成桌面exe
- 底层是系统WebView2(Edge内核)渲染HTML
- C#代码运行在原生.NET进程,不是浏览器wasm> > 适合:想用一套Razor界面,打包Windows桌面程序。
Razor组件示例(Counter.razor)
less
@page "/counter"
<h1>Counter</h1>
<p>Count: @currentCount</p>
<button @onclick="IncrementCount">Click me</button>
@code {
private int currentCount = 0;
private void IncrementCount()
{
currentCount++;
}
}
Razor:HTML + C#混写,@code块写C#逻辑,@onclick绑定事件。
五、三大框架模板关键差异总结
- WinForms
-
模型:事件驱动,拖拽窗体控件
-
UI:GDI+原生控件
-
代码风格:传统窗体后台代码
-
模板最简,适合快速工具开发
2.WPF
-
-
模型:XAML声明UI + 依赖属性 + 数据绑定,推荐MVVM
-
UI:DirectX矢量渲染,高度自定义
-
模板自带App+Window XAML分离结构
-
3.Blazor
-
-
模型:组件化Razor,WebUI模型
-
UI:HTML+CSS渲染
-
模板分Server/WASM/Hybrid,Web优先;Hybrid可以做桌面
-
六、选型建议
- 快速做Windows内部工具、旧系统维护 → WinForms
- 需要炫酷自定义界面、可视化、专业桌面客户端 → WPF
- Web管理系统,或者一套UI同时网页+桌面端(Hybrid) → Blazor