微软官方开源:不用一行 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 布局、图表、导航、数据网格、主题。

最直观的是这个计数器,一个类就完事:

bash 复制代码
using Microsoft.UI.Reactor;
using Microsoft.UI.Reactor.Core;
using static Microsoft.UI.Reactor.Factories;

ReactorApp.Run<MyApp>("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 仓库,脚手架直接生成:

bash 复制代码
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 -

点击下方公众号卡片,关注我