微软官方开源:不用一行 XAML,WinUI 也能像 React 那样写
有没有和我一样的感受。
WinUI 3 那套 XAML + MVVM,是能干活,但憋屈。少写一个 x:Name,编译一点事没有,跑起来白屏。ViewModel 里一层又一层 INotifyPropertyChanged 样板,写多了自己都烦。改个绑定路径,得在 XAML 和 C# 之间来回瞅。
最难受的是状态和界面被硬拆成两半。React 里一个组件装得整整齐齐,到了 WinUI 要拆成 ViewModel、XAML、code-behind 三份,改个小功能得动三个地方。
所以 最近官方在 GitHub 开源 Microsoft.UI.Reactor 时,我第一反应是:官方终于自己动手了。
基本情况:微软官方项目,官方自己标了实验性,MIT 协议。800 出头 Star,62 个 Fork,10 月 29 日还有提交,不是扔出来就没人管那种。NuGet 上是 0.1.0-preview.16。
一句话说清它是什么:还是 WinUI,只是换个写法。 你渲染出来的 Button、TextBox、NavigationView 全是真控件,跑在 Windows App SDK 上,一点没变。变的是你怎么描述这个界面。
这点得先说明,很多人看标题以为微软又造了个新 UI 框架,真没有。
01|它到底改了什么
说白了四件事:
-
• 中间加了一层虚拟元素树,新旧两棵一比,只把改过的打到真控件上;
-
• 把 React 的 Hooks 搬过来,
UseState、UseEffect、UseReducer这些一共 9 个,状态跟界面写一块; -
• 用 C# 方法代替 XAML,控件、属性、事件全是强类型;
-
• 顺手送一堆积木:Flex 布局、图表、导航、数据网格、主题。
最直观的是这个计数器,一个类就完事:
using Microsoft.UI.Reactor;
using Microsoft.UI.Reactor.Core;
using static Microsoft.UI.Reactor.Factories;
ReactorApp.Run("Hello Reactor");
class MyApp : Component
{
public override Element Render()
{
var (count, setCount) = UseState(0);
return VStack(
Heading($"Count: {count}"),
HStack(8,
Button("-", () => setCount(count - 1)),
Button("+", () => setCount(count + 1))
)
);
}
}
没有 App.xaml,没有 MainWindow.xaml,没有 code-behind,也没有 ViewModel。状态、界面、点击事件全在一个 Render() 里。
我喜欢的是它不要求你学新东西——会 C# 就会写,IntelliSense、重构、编译检查都在,不用再对着字符串绑定猜哪写错了。

Microsoft.UI.Reactor 仓库头图
反过来,这也是它最麻烦的地方:UI 变成代码之后,靠设计器拖拽的人会很难受。
02|有3个还不错的
第一,报错提前了。 XAML 里的绑定路径说到底就是字符串,写错了设计器不一定管,跑起来才发现。Reactor 里全是方法调用,改名的时候编译器会跟着报错。
第二,状态能就近放。 MVVM 那套拆法,页面一复杂就容易变成 ViewModel 越写越胖、绑定表达式绕来绕去。Hooks 更像 React 的思路:状态就地声明,副作用就地管,组件拆起来也干净。官方管这叫 Functional MVU。
第三,协调器是真下了本。 README 里写了几个数:核心框架连着迭代 13 天,跟 React、SwiftUI、Compose 做过一轮对标评审,还做了一次挑出 275 条问题的代码评审。
至少能看出团队是认真在做,不是赶热点发个空仓库。
03|配套也都集成进来了
它把 WinUI 周边配套搬进来一大堆。每个模块成熟到什么程度,官方标得清清楚楚(Preview / Draft / Early):
|
模块
|
它做了什么
|
成熟度
|
| :-- | :-- | :-- |
|
Flex 布局
|
Meta Yoga 的纯 C# 移植,配 FlexPanel
|
Preview
|
|
图表
|
D3 完整算法移植 + 声明式图表 DSL
|
Preview
|
|
Markdown
|
原生 md4c 解析器 + Markdown() 元素
|
Preview
|
|
命令
|
命令记录 + 16 个标准命令 + 焦点作用域快捷键
|
Preview
|
|
导航
|
类型安全路由、GPU 转场、返回栈序列化
|
Draft
|
|
无障碍
|
WCAG 2.1 AA 目标,编译期与运行时校验
|
Draft
|
|
停靠窗口
|
VS 式停靠:标签拖出、跨窗口停靠、浮动面板
|
Draft
|
|
WinForms 互操作
|
在 WinForms 应用里托管 WinUI 内容
|
Draft
|
|
数据
|
DataGrid、PropertyGrid、FormField、异步校验
|
Early
|
|
工具链
| mur
CLI、40+ Roslyn 分析器、进程内 MCP server
|
Draft
|
有两个我想单独提。
一是 [GenerateReactorWrapper] 源生成器,能把任意 WinUI 控件自动包成 Reactor 元素,双向往属性都帮你生成好。说人话就是:第三方控件库不用干等官方适配,自己包一层就能接进来。这对 WinUI 这套东西挺关键。
二是 内置的 MCP server。DevTools 里自带一个,专门给 AI Agent 用——查 UIA 树、看布局开销、截图、读结构化日志。微软做 UI 框架的时候,已经默认旁边坐着一个 Agent 了。这个值得期待。
04|项目没到能使用的程度
README 写得很直白:开发产品还是建议继续使用 XAML/MVVM 开发的。Reactor 里做的无障碍 API、主题、命令、数据栈,本来就要搬回 WinUI。想试新写法,可以在同一个进程、同一棵视觉树里跑;想混着用也行,Reactor 的内容能塞进 XAML 应用,XAML 的内容也能塞进 Reactor 应用。
连 Rust 那边也做了一份:windows-rs 仓库里的 windows-reactor,思路一样,已经发到 crates.io。语言不同,底下是同一批原生控件。
目前实验期给的是 3 到 6 个月。总的来说:现在可以学习下,不是拿去做上线产品。
05|使用也简单,三条命令
不用 clone 仓库,脚手架直接生成:
winget install Microsoft.WinAppCli
winapp new -t reactor -n MyApp
cd MyApp
dotnet run
winapp new 会按需装模板包,省得手动去 pin 预览版本。想从更完整的壳开始,可以试 reactor-mvu、reactor-navview、reactor-tabview,winapp new --list 能看到全部。
两个条件:Windows 得开开发者模式(设置 → 系统 → 开发者选项);脚手架生成的是单项目 MSIX 打包应用,dotnet run 会带完整包标识启动。
要改框架本身的话,官方标了两个坑,我原样抄给你:
-
• 克隆到短路径。XAML 和资源编译器是 32 位工具,不支持长路径,放在嵌套很深的目录或者 OneDrive 同步目录里,很容易撞上 260 字符上限,报
MSB3073/PRI210; -
• 必须显式指定平台,
dotnet build -p:Platform=x64(或 ARM64),漏掉就会触发WindowsAppSDKSelfContained报错。
开源地址:https://github.com/microsoft/microsoft-ui-reactor
写在最后
现在AI时代,UI方面热点确实不高。
第一,800 Star 这个数字很实在。热度都在 AI 那边,桌面 UI 本来就冷,周边样例、控件、踩坑帖都少。你遇到的问题,大概率搜不到答案。
第二,它还是预览版,0.1.0-preview.16,API 说变就变。AOT 有一份兼容矩阵,哪些子系统在 PublishAot=true 下会抛异常,官方列得很清楚。最糙的是 VS 内嵌预览的 VSIX,官方自己都说拿去冒烟测试就行,别当日常开发用。
第三,它改的是怎么写,不是周边那套东西。XAML 攒了十几年的设计器、绑定工具、控件库、教程,不是几个月补得上的。
那还值不值得看?我觉得值得,但别抱太高预期。
- End -
点击下方公众号卡片,关注我
原文地址: https://www.cveoy.top/t/topic/qHQ8 著作权归作者所有。请勿转载和采集!