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

news/2024/7/3 4:12:52/文章来源:https://www.cnblogs.com/jasongrass/p/18276795

微软搞出了很多构建 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,而且不会有更新的版本了,但是 .NET Core 一直在更新。如果没有什么特殊的理由,应该直接使用 .NET Core 来构建 WinForms 和 WPF 程序。

这里可以看到一些 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 的一部分,并不独立存在。
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 的一部分,同样有最低系统版本的要求。

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 实现夸平台应用,尤其是复杂应用的好时机,让子弹再飞一会儿吧。

Uno Platform

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

Uno Platform: Create Beautiful‎ - .NET apps faster

Avalonia UI

Avalonia UI

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

扩展

.NET 之前的 UI 框架

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

其它 .NET 内的框架

处理 UI 相关的框架,比较出名的还有 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 还是 .NET MAUI? :r/csharp --- WinUI or .NET MAUI? : r/csharp

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/735989.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker详细安装教程

安装Docker: # 1,, 卸载旧的版本# 2,需要的安装 yum install -y yum-utils# 3, 设置镜像的仓库 https://blog.csdn.net/qq_43168442/article/details/116770163 (访问这个博客网站进行配置)# 更新yum软件包索引 yum makecache fast# 4,安装docker docker-ce 社区 ee企业…

详细讲解 Keil Pack Installer,以及通过 Keil 官网获取 Pack

前言 大家好,我是梁国庆。 收到粉丝留言,说 Keil 安装 Pack 不太明白,可不可以详细演示一下?当然可以有,直接视频+文章全部安排,我就是宠粉。 PS:第一次录视频有些紧张,见谅哈。微信视频号:https://weixin.qq.com/sph/AXbpYwEaw b站:https://www.bilibili.com/video…

webdav协议及我的笔记方案(私有部署)

背景 用markdown用于文章写作,有几年时间了,不是很喜欢折腾,主要就是在电脑上写,用的笔记软件就是typora。由于里面有很多工作相关的,以及个人资料相关的(包含了各种账号、密码啥的),所以不敢往各种云服务上放,还是想着数据由自己来管着。 自己管数据的话,就是数据存…

模拟集成电路设计系列博客——8.3.2 PLL中的抖动与相位噪声

8.3.2 PLL中的抖动与相位噪声 在PLL中有若干种抖动源,具体来说包括:输入参考的抖动\(\phi_{in}\) VCO中的抖动 环路滤波器产生的噪声 分频器产生的噪声由于任何实际PLL中的抖动都相对较小,因此分析其在环路中和环路内的传播可以使用线性小信号模型。上面列出的噪声源出现在环…

【git】github如何上传超过100MB大小的单个文件

在使用 GitHub 进行版本控制时,默认情况下,单个文件的大小限制为 100MB。 如果你需要上传超过这个大小的文件,可以使用 Git LFS(Large File Storage)。 Git LFS 是一种 Git 扩展,专门用于处理大文件,它将大文件替换为轻量级的指针,并将实际的文件内容存储在远程服务器上…

ros2 - microros - 雷达 -可视化点云

上一节完成了指定角度距离的测量这一节我们将其合成ROS的laserscan消息,并将其通过microros发布到上位机,最终实现rviz2的可视化。 一、雷达消息介绍使用指令ros2 interface show sensor_msgs/msg/LaserScan,可以看到ROS2对雷达数据接口的定义。# Single scan from a planar…

玄机流量特征分析-蚁剑流量分析

玄机流量特征分析-蚁剑流量分析 1.木马的连接密码是多少 2.黑客执行的第一个命令是什么 3.黑客读取了哪个文件的内容,提交文件绝对路径 4.黑客上传了什么文件到服务器,提交文件名 5.黑客上传的文件内容是什么 6.黑客下载了哪个文件,提交文件绝对路径1.过滤http,发现连接密码…

F407在RAM中调试

在RAM中调试代码 一.软硬件操作 硬件方面需要先修改BOOT0和BOOT1的引脚的高低电平。SRAM运行模式BOOT0和BOOT1都是高电平。软件方面: 1.需要先取消勾选Use Memory Layout from Target Dialog,点击下方的Edit编辑.sct2.修改.sct分散加载文件 原始文件 LR_IROM1 0x08000000 0x0…

制作badusb上线CS

‍ 前言在2014年美国黑帽大会上,安全研究人员JakobLell和独立安全研究人员Karsten Nohl展示了他们称为“BadUSB”的攻击方法,这种攻击方法让USB安全和几乎所有和USB相关的设备(包括具有USB端口的电脑)都陷入相当危险的状态现在的USB设备很多,比如语音视频设备、摄像头等,因…

【数据结构】常见的几种数据结构

常见的数据结构:数组、链表、队列、栈、、堆、二叉树、B树、哈希表、图 数组 因为数组内的元素是连续存储的,所以数组中元素的地址,可以通过其索引计算出来。根据索引查找元素,时间复杂度是 \(O(1)\)。 动态数组动态数组具体代码实现 import java.util.Arrays; import java…

QT6.7.2 MSVC源码编译 静态库 动态库

QT6.7.2 MSVC源码编译 静态库 动态库 也可以参考官方的文档 https://doc.qt.io/qt-6/build-sources.html 环境搭建 为了操作更有可复制性,这里在虚拟机中采用全新安装的系统进行配置。 系统镜像为:en-us_windows_10_enterprise_ltsc_2021_x64_dvd_d289cf96_2.iso 安装 Visual…

CPU管理 多进程图像

CPU管理 && 多进程图像 要管理CPU,先要学会使用CPU CPU的工作方式在操作系统学习之初就已经提过:取值执行程序存放在内存中,每段指令对应一个地址 CPU发出取指命令,将想取地址通过地址总线传到PC 内存根据地址取出对应地址的指令 从总线传回,CPU解释执行总之,就是…

电子显微镜对生物的观察

某黄色小虫,大概 \(100μm \times 400μm\) 的样子。

ARM Cortex-A 与 STM32 F107

ARM Cortex-A 和 STM32 F107 是两种不同的微控制器架构,它们在性能、应用场景和硬件支持方面有很大的差异。以下是它们的详细比较和分析: 1. 基本特性比较ARM Cortex-A 系列ARM Cortex-A 是 ARM 架构中的高级应用处理器系列,专为复杂的计算任务和高级应用设计。它广泛用于智…

前端开发 | Node 版本管理器选择

一、Nvm nvm 是一款 Node.js 版本管理工具,允许用户通过命令行快速安装、切换和管理不同的 Node.js 版本。nvm 只适用于 macOS 和 Linux 用户的项目,如果是 Windows 用户,可以使用 nvm-windows 、nodist或 nvs 替换。 安装方式 macOS 下载方式: brew install nvm # or sh 命…

示波器基本使用方法

示波器 示波器的基本使用方法首先检查示波器包装中是否有下列物品:• 示波器。 • 电源线。 • N2841A 10:1 10 MΩ 无源探头,数量= 2连接电源和信号源:将示波器的电源插入电源插座,并确保电源适配器或电池充足。 将需要测量的信号源(例如电路板、信号发生器等)连接到示波…

ros - Adafruit ESP32 Feather与树莓派(Raspberry Pi)比较

Adafruit ESP32 Feather 和树莓派(Raspberry Pi)都是广泛使用的硬件平台,分别在嵌入式系统和单板计算机领域具有各自的优势。以下是它们的详细比较,以及它们对机器人操作系统(ROS)的支持程度的分析。 1. 基本特性比较Adafruit ESP32 Feather核心处理器: 双核 Xtensa LX6(…

【App Service】解决 .NET Profiler 报告打开后无数据加载的问题

问题描述 App Service上可以收.NET 应用的Profile Trace文件,并且可以自动分析报告。 Collect a Profiler Trace If your app is down or performing slow, you can collect a profiling trace to identify the root cause of the issue. Profiling is light weight and is de…

1. Docker快速起步

Docker先安装Docker,再讲课没有Docker的日子里在以前的开发时代,开发人员把自己开发好的war交付给运维人员,运维人员为了把war部署到服务器上且保证能运行,就必须由运维人员在服务器上搭建好运行环境! 可这样带来的问题是,如果开发环境与部署环境不一致(比如版本),则会…