首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >使用 .NET 构建 UI 界面的各种方式

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

作者头像
jgrass
发布于 2024-12-25 10:44:35
发布于 2024-12-25 10:44:35
6580
举报
文章被收录于专栏:蔻丁杂记蔻丁杂记

微软搞出了很多构建 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://cloud.tencent.com/developer/article/2481595

本作品采用 「署名 4.0 国际」 许可协议进行许可,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024年7月1日 |,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Scala变量和常用数据类型
同Java一样,Scala也有8种基本数据类型:Byte、Char、Short、Int、Long、Float、Double以及Boolean。
栗筝i
2022/12/01
4540
Scala变量和常用数据类型
scala数据类型
Scala 与 Java有着相同的数据类型,在Scala中数据类型都是对象,也就是说scala没有java中的原生类型 Scala数据类型分为两大类 AnyVal(值类型) 和 AnyRef(引用类型), 注意:不管是AnyVal还是AnyRef 都是对象。
若与
2020/05/18
4610
scala数据类型
Scala 基础 (二):变量和数据类型
Scala中的关键字合集: • package, import, class, object, trait, extends, with, type, for • private, protected, abstract, sealed, final, implicit, lazy, override • try, catch, finally, throw • if, else, match, case, do, while, for, return, yield • def, val, var • this, super • new • true, false, null
百思不得小赵
2022/12/01
9550
Scala 基础 (二):变量和数据类型
scala(二) 变量与数据类型
scala 注释 与 java 完全一样 // 单行注释 /*...*/ 多行注释 /**...*/ 文本注释注释
用户1483438
2022/04/11
1.5K0
scala基本数据类型
Scala与Java具有相同的数据类型,具有相同的内存占用和精度。 序号 数据类型 说明 1 Byte 8位有符号值,范围从-128至127 2 Short 16位有符号值,范围从-32768至32767 3 Int 32位有符号值,范围从-2147483648至2147483647 4 Long 64位有符号值,范围从-9223372036854775808至9223372036854775807 5 Float 32位IEEE 754单精度浮点值 6 Double 64位IEEE 754双精度浮点值 7
静谧星空TEL
2021/04/27
2880
大数据技术之_16_Scala学习_02_变量
第二章 变量2.1 变量是程序的基本组成单位2.2 Scala 变量的介绍2.2.1 概念2.2.2 Scala 变量使用的基本步骤2.3 Scala 变量的基本使用2.4 Scala 变量使用说明2.4.1 变量声明基本语法2.4.2 注意事项2.5 Scala 程序中 +号 的使用2.6 Scala 数据类型2.6.1 scala 数据类型体系一览图2.6.2 scala 数据类型列表2.7 整数类型2.7.1 基本介绍2.7.2 整型的类型2.7.3 整型的使用细节2.8 浮点类型2.8.1 基本介绍2.8.2 浮点型的分类2.8.3 浮点型使用细节2.9 字符类型:Char2.9.1 基本介绍2.9.2 案例演示2.9.3 字符类型使用细节2.9.4 字符类型本质探讨2.10 布尔类型:Boolean2.11 Unit 类型、Null 类型和 Nothing 类型2.11.1 基本说明2.11.2 使用细节和注意事项2.12 值类型转换2.12.1 值类型隐式转换2.12.2 自动类型转换细节说明2.12.3 高级隐式转换和隐式函数2.12.4 强制类型转换2.13 值类型转换练习题2.14 值类型和 String 类型的转换2.14.1 介绍2.14.2 基本数据类型转 String 类型2.14.3 String 类型转基本数据类型2.14.4 注意事项2.15 标识符的命名规范2.15.1 标识符概念2.15.2 标识符的命名规则(要记住)2.15.3 标识符举例说明2.15.4 标识符命名注意事项2.15.5 Scala 关键字2.16 作业01
黑泽君
2019/04/09
1.4K0
大数据技术之_16_Scala学习_02_变量
2021年大数据常用语言Scala(六):基础语法学习 数据类型与操作符
有一个字符串"abc",再创建第二个字符串,值为:在第一个字符串后拼接一个空字符串。
Lansonli
2021/10/11
3380
scala快速入门系列【数据类型与操作符】
作为scala快速入门系列的第五篇博客,小菌为大家带来的是关于数据类型与操作符的内容。
大数据梦想家
2021/01/26
3710
scala快速入门系列【数据类型与操作符】
Scala基础入门(五)Scala 内置9种数据类型
在 Scala 中,所有数据类型的根类型是 AnyVal , 类似于 java 中的 Object 类。 以下是 AnyVal 的文档说明:
青山师
2023/05/04
2380
快速学习-Scala Unit类型、Null类型和Nothing类型
Scala Unit类型、Null类型和Nothing类型 Unit类型、Null类型和Nothing类型 基本说明 使用细节和注意事项 Null类只有一个实例对象,null,类似于Java中的nul
cwl_java
2020/02/24
1.5K0
快速学习-Scala Unit类型、Null类型和Nothing类型
必知|Scala类型层次结构
java的除了原始类型的所有类都有一个默认的父类Object,那么scala的统一父类是什么呢?这个是有人在群里问浪尖的一个问题,今天浪尖就给大家讲解一下Scala类型层次结构
Spark学习技巧
2020/04/27
1.3K0
深入理解 Java 基本数据类型
一般情况下,定义了某数据类型的变量,就不能再随意转换。但是 JAVA 允许用户对基本类型做有限度的类型转换。
静默虚空
2019/05/25
1.2K0
Java基础(5)-Java数据类型
本文为joshua317原创文章,转载请注明:转载自joshua317博客 https://www.joshua317.com/article/180
joshua317
2021/11/05
5250
Scala教程之:面向对象的scala
我们知道Scala是一种JVM语言,可以合java无缝衔接,这也就大大的扩展了scala的应用范围,大数据里面有名的spark就是使用scala编写的,那么scala到底有什么奥秘和特性呢?我们一一来揭秘。
程序那些事
2020/07/07
6760
Java 之数据类型
基本类型与引用类型的区别: 1.基本类型与引用类型的组成 基本类型是一个单纯的数据类型,它表示的是一个具体的数字、字符或一个布尔值,例如100、'M'和true。对于引用类型,若一个变量引用的是一个复杂的数据结构的实例,则该变量的类型就属于引用类型,在引用类型变量所引用的实例中,不仅可以包含基本类型的变量,还可以包括对这些变量进行操作的行为。 例如:创建一个People类,该类中包含了一个short型的成员变量和一些String型变量,并且定义了对这些成员变量进行操作的方法,其代码如下: public class People{     private String id;                        //表示身份证号码     private String name;                          //表示姓名     private short age;                       //表示年龄     private String sex;                      //表示性别  public void setId(String id){         //设置成员变量id值的方法         this.id=id;     }     public String getId(){                         //返回成员变量id值的方法         return this.id;     }     …//省略了其他成员变量的setXXX()与getXXX()方法 } 下面创建People类的两个实例,并分别通过变量you和me引用: People you=new People(); People me=new People(); 则变量you与me的类型为引用类型,并且引用的是类的实例,所以更具体的为类引用类型。对于类引用类型变量,通过运算符“.”就可以访问类中的成员变量和方法了。例如,通过以下代码分别为变量you与me所引用的实例设置成员变量name的值: you.setName("reader");                              //设置name值为"reader" me.setName("MR");                                  //设置name值为"MR" 通过以下代码来输出引用变量you与me所引用实例的name值: System.out.println(you.getName());                   //输出"reader" System.out.println(me.getName());                    //输出"MR" 2.Java虚拟机的处理方式 对于基本类型的变量,Java虚拟机会根据数据类型为其分配实际占用的内存空间,如对int型变量为其分配32位内存空间并存放变量值。 而对于引用类型变量,Java虚拟机同样要为其分配内存空间,但该空间内存放的并不是变量所引用的对象,而是对象在堆区存放的地址。所以引用变量最终只是指向被引用的对象,而不是存储了被引用的对象,因此两个引用变量之间的赋值,实际上就是将一个引用变量存储的地址复制给另一个引用变量,从而使两个变量指向同一个对象。 例如:定义两个Book类型的类引用变量book1和book2,其中变量book1引用Book类的一个对象,book2不引用任何对象。 Book类中定义了一个float型成员变量price,表示价格,代码如下: public class Book{     private float price=50.0f;                   //float型成员变量price, 表示价格     private int store=100;                        //int型成员变量store, 表示库存     private String name;                          //String类型成员变量name, 表示书名 } 通过以下代码定义book1和book2引用变量。 Book book1=new Book(); Book book2=null; Java虚拟机为引用变量book1、book2及book1所引用对象的成员变量分配的内存空间如图1所示。 从图1可以看出变量book1引用了Book类的实例,book2没有引用任何对象,下面通过如下代码对book2变量进行赋值。 book2=book1     //将book1引用对象的地址复制给book2变量, book1与boo
ccf19881030
2019/04/23
1.2K0
Scala Essentials: 字面值
https://segmentfault.com/a/1190000004854613 类型系统 引用类型 AnyRef 的子类 使用new 构造对象 当存在默认构造函数,可以略去括号 AnyR
Albert陈凯
2018/04/04
6130
Scala Essentials: 字面值
Java数据类型(八种基本数据类型 + 四种引用类型)、数据类型转换
float、double不能用来表示精确的值,运算不精确——>解决方案:BigDecimal。
寻求出路的程序媛
2024/02/27
12K0
Java数据类型(八种基本数据类型 + 四种引用类型)、数据类型转换
Java 数据类型(全网最全)
程序本质上是对数据的处理(逻辑运算),因此任何语言都需先解决如何表征【数据】这个核心概念。数据作为抽象的概念,天然的包含2个方面属性:
kcodez
2023/02/25
6920
Java 数据类型(全网最全)
基本数据类型
关于java的类型,这里讲解基本类型,引用类型较复杂,分开来讲,那么开始把,基本类型有8种:
晚上没宵夜
2020/03/10
6170
Scala 数据类型(二)
Scala 与 Java有着相同的数据类型,下表列出了 Scala 支持的数据类型:
王知无-import_bigdata
2019/03/15
7310
相关推荐
Scala变量和常用数据类型
更多 >
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档