Loading

使用 .NET 构建 UI 界面的各种方式

微软搞出了很多构建 UI 程序的框架,如 WinForms WPF WinUI MAUI,他们之间的简单对比可以看如下这篇官方文档

Overview of framework options - Windows apps | Microsoft Learn

本文主要是记录一下在搜索相关问题时,对了解到的内容进行的简要记录,不一定准确,如果发现错误,请留言补充。

1 .NET Framework 时代的 WinForms 与 WPF

Windows Forms 是直接依赖 GDI+ 和 Win32,可以理解为是对 Win32 和 GDI+ 的封装。

Windows Presentation Foundation 依赖的是 DirectX,

可以从这里了解到更详细的 WPF 的架构说明:Architecture - WPF .NET Framework

2 .NET Core 时代的 WinForms 与 WPF

dotnet/winforms: Windows Forms is a .NET UI framework for building Windows desktop applications.
dotnet/wpf: WPF is a .NET Core UI framework for building Windows desktop applications.

为什么要将 WinForms 和 WPF 迁移到 .NET Core 下?毕竟就算迁移了,还是只能在 Windows 下使用,不能跨平台。

Differences between .NET Framework and .NET - WPF

这篇文章说了三个形式上的变更:
1 project 风格更优雅了(从 csproj 文件能看出来)
2 nuget 包的管理方式变了
3 CAS 被移除了

迁移到 .NET Core 之后,或许是丢掉了一些不必考虑的旧的兼容处理,并且可以全面拥抱 .NET Core 的运行时。好处有这些:

1 可以使用 side-by-side / self-contained 的部署方式,也就是用户电脑上不一定要安装相应的 .NET Core 版本,应用程序可以自己带上所有的框架依赖
2 可以用到最新的 C# 特性和运行时 API
3 得益于 .NET Core 基础库本身的性能优化,一些操作会获得更好的性能
4 可以使用 dotnet cli 来完成很多 devops 相关的工作

当然,WinForms 还是依赖 GDI+ 和 Win32, WPF 也还是依赖 DX,这点本身并没有改变,所以,他们并不能夸平台。

还有就是,.NET Framework 最新版本是 4.8.1,而且不会有大的版本更新了,但是 .NET Core 一直在更新。.NET5 .NET6 .NET7 .NET8,还在持续更新中。
如果没有什么特殊的理由,应该直接使用 .NET Core 来构建 WinForms 和 WPF 程序。

PS .NET Core 后面就不叫 .NET Core XXX 了,直接就是 .NET XXX

这里可以看到一些 WPF 的更新:What's new in WPF for .NET 8 - WPF .NET | Microsoft Learn

也可以将旧的程序升级到 .NET Core
Upgrade a WPF app to .NET 8 - WPF .NET | Microsoft Learn

3 UWP (Universal Windows Platform)

UWP Documentation - UWP app developer | Microsoft Learn
Reference for Universal Windows Platform (UWP) apps - Windows UWP applications | Microsoft Learn

UWP 随 Win8 推出,从名称(通用 Windows 平台)可以看出,目标是写一套代码开发的 APP,可以在多个 Windows 平台上运行,如 PC,WinPhone,HoloLens,Xbox,IoT 等。

但 UWP 依赖的 Windows Runtime (WinRT) 是直接集成到操作系统中的,如果用户的操作系统没有更新,开发者就无法使用最新的 API,这是一个巨大的依赖问题。

所以就有了 WinUI 2.x 来解决这个问题,在开发 UWP 应用时,可以引用 WinUI 2.x 的 nuget 包,来使用更新的控件等内容,但 UI Framework 部分仍然是集成在操作系统中的,也就是与操作系统仍然是强绑定的。

所以就有了 WinUI 3,类似 WPF 等,WinUI3 本身包含完整了 Framework 和控件库,不需要操作系统提供额外的太多特殊支持,是一个独立的 UI 框架。

UWP 一个技术上成功但商业上失败的框架之死;一个现代的操作系统究竟应该提供什么? - Anduin Xue

UWP 有个核心特征是,UWP 是在沙箱中运行的,具有良好的安全性,但灵活性就收到了很大的限制。

注意,UWP 本身并不是一个 UI 框架,是一个 App Model,与之对应是 Win32 App Model。UI 部分由 WinUI 提供,可以理解为,WinUI1 就是最初 UWP 体系内,提供 UI 的组件。

4 WinUI 1 2 3

WinUI1 就是 UWP 的一部分,并不独立存在。(这是个人理解,不一定准确,也可以将 WPF 称为 WinUI1)
WinUI2 是为 UWP 提供的独立 nuget 包,为了解决 UWP 控件的操作系统依赖问题。(但 UI 框架层仍集成在操作系统中)
WinUI3 是完全独立的 UI 库(包括控件库与UI框架),可以用在 WinForms 和 WPF 中


comparison-of-winui-3-and-winui-2

5 WinUI 3

microsoft/microsoft-ui-xaml: Windows UI Library: the latest Windows 10 native controls and Fluent styles for your applications

WinUI 3 - Windows apps | Microsoft Learn


可以在 Windows 应用商店下载 WinUI3 Gallery 来浏览 WinUI3 当前支持的控件。


WinUI3 有 winui3 in uwp 和 winui3 in desktop 的区别,前者运行在 UWP 运行时中,是一个沙箱程序,文件、网络等相关的交互,都需要声明权限,并需要用户同意,好处是 UWP 有生命周期管理,在应用最小化等场景下,程序可以不运行,以节省能量消耗。
后者与 WPF 等类似,就是通常的 Windows 桌面程序。

WinUI3 可以通过 XAML IsLands 的方式,嵌入到 WPF/WinForms 中。

在许多情况下,可以使用 XAML Islands 将现代化 XAML 控件添加到应用。 但是,如果需要创建超越内置控件功能范围的自定义体验,可以访问视觉层 API。
Modernize your desktop app using the Visual layer - Windows apps | Microsoft Learn

Can I use winUI 3 class library to WPF ? - Microsoft Q&A

甚至,如果你使用 C++ 进行 Win32/MFC 开发,也可以将 WinUI3 嵌入其中,构建更现代的应用。(但或许有什么坑?不确定是否真的会有正式项目会这么做)

6 Windows App SDK

microsoft/WindowsAppSDK: The Windows App SDK empowers all Windows desktop apps with modern Windows UI, APIs, and platform features, including back-compat support, shipped via NuGet.

Build desktop Windows apps with the Windows App SDK - Windows apps | Microsoft Learn

Windows App SDK 通过 nuget 包提供,但并非完全不依赖操作系统,最低要求是 Win10 1809.
Windows App SDK and supported Windows releases. - Windows apps | Microsoft Learn

GPT: Windows App SDK(以前称为 Project Reunion)的设计目标之一是提供一个统一的开发平台,使得开发者可以更轻松地创建跨不同 Windows 版本和设备的应用程序。然而,尽管 Windows App SDK 旨在减少对特定操作系统版本的依赖,它仍然在很大程度上依赖于 Windows Runtime APIs(WinRT)

WinUI3 是作为 Windows App SDK 的一部分,同样有最低系统版本的要求。

7 MAUI

What is .NET MAUI? - .NET MAUI | Microsoft Learn
.NET Multi-platform App UI documentation - .NET MAUI | Microsoft Learn
dotnet/maui: .NET MAUI is the .NET Multi-platform App UI, a framework for building native device applications spanning mobile, tablet, and desktop.

MAUI 源自 Xamarin,是跨平台的 UI 框架,在 PC 平台上,使用的就是 WinUI3。

.NET for Android 就是 Xamarin.Android, .NET for iOS 就是 Xamarin.iOS, .NET MAUI 就是 Xamarin.Forms, 微软改名部再立大功

目前可能还不是使用 MAUI 实现跨平台应用(搜到的几个评价都一般),尤其是复杂应用的好时机,让子弹再飞一会儿吧。

8 Uno Platform

Uno Platform 是实现跨平台 UI 的另一个方案,基于 WinUI3,把 WinUI3 带到其它平台,甚至是通过 WebAssembly,可以构建 Web UI。

Uno Platform: Create Beautiful‎ - .NET apps faster

9 Avalonia UI

Avalonia UI
AvaloniaUI/Avalonia: Develop Desktop, Embedded, Mobile and WebAssembly apps with C# and XAML. The most popular .NET UI client technology

Avalonia 目前更专注桌面端的跨平台方案,源自 WPF。从官网说明来看,也有向移动端发展的想法。

Avalonia XPF currently supports Windows, macOS and Linux (desktop and embedded). WebAssembly, iOS and Android support is coming in 2024.

然后 Avalonia 还有一个 XPF 方案,可以低成本迁移 WPF 程序到 macOS 和 Linux 端,不过是收费的。

Avalonia UI - XPF

10 扩展

.NET 之前的 UI 框架

在 .NET 之前,有 MFC 这个 C++ UI 框架,但其实,这段远古的历史还要复杂得多,而且命令也非常混乱,不愧是微软改名部。
详细阅读:Windows编程革命简史 | 酷 壳 - CoolShell

其它 .NET 内的框架

除了 UI 相关的框架,.NET 中比较出名的还有服务端的 asp.net,对应 .NET Core 的版本就是 asp.net core,对应新项目而言,当然是直接使用 asp.net core。
一些对比与区别,见如下的文档

Choose between .NET and .NET Framework for server apps
Choose between ASP.NET 4.x and ASP.NET Core

参考文献

本文大部分内容,根据下面这个视频整理,可能有过时或者错误的地方,欢迎留言讨论。
WinUI 3.0 - Building Modern Desktop Apps with .NET and C# - YouTube

其它参考:

WinUI vs WPF, WinForms, UWP, and MFC | ComponentOne
目前 Window 平台主推的 UI 技术到底是啥? - V2EX
Windows 11出世UWP却惨遭弃用!Windows 软件还会翻新吗-51CTO.COM
UWP 一个技术上成功但商业上失败的框架之死;一个现代的操作系统究竟应该提供什么? - Anduin Xue
What is the difference between MAUI and WinUI? · dotnet/maui · Discussion #47
WinUI or .NET MAUI? : r/csharp

原文链接:https://www.cnblogs.com/jasongrass/p/18276795

posted @ 2024-07-01 21:20  J.晒太阳的猫  阅读(560)  评论(5编辑  收藏  举报