倒反天罡:把C#/.NET的Avalonia UI 搬到 Rust? 大家好搬砖工呀今天搞个大新闻Avalonia 是 .NET 世界里最像 WPF 的跨平台 UI 框架保留模式、XAML、样式选择器、数据绑定、控件主题、自带合成器。现在 FerroUI把这一整套东西从 C# 换成 Rust一个文件一个文件地搬过来架构和写法都不变。一、FerroUI介绍目前rust生态下的各种gui框架框架范式界面怎么描述egui立即模式每帧重建纯 Rust 代码icedElm 风格的 MVU纯 Rust 代码Slint声明式自有的.slint标记语言Tauri / Dioxus界面交给 WebView / DOMHTML CSSFerroUI保留模式 样式系统Rust 代码或 XAML如果用C#最成熟的UI框架AI时代最好的语言Rust最完美UI框架这个等式会成立吗一起往下看。1.1项目主页https://github.com/wieslawsoltes/FerroUIwasm版的主页https://wieslawsoltes.github.io/FerroUI/可以通过浏览器直接打开Gallery.很流畅功能很丰富。除了生成的wasm体积有点大有很大的优化空间。1.2 Gallery几乎所有的组件都已经完成移植对中文IME的支持也不再话下。是不是一模一样再看看xaml写法扩展名都没变。1.3 Xaml写法Window xmlnshttps://github.com/ferroui xmlns:xhttp://schemas.microsoft.com/winfx/2006/xaml TitleHello StackPanel Margin16 Spacing8 TextBlock Text{Binding Greeting} / Button ContentClick Command{Binding ClickCommand} / /StackPanel /Window一起来看看项目的具体完成情况。二、项目完整性2.1项目结构和Avaloina确实是一样的。只是全部换成Rust实现。3.2功能完整性项目目前完成情况从框架的功能上看目前完成度还算可以。范围状态Property system, trees, layout, input, styling, resources已完成Data binding, animation, transitions已完成Media, text layout, fonts已完成Compositor and render loop已完成Controls已完成XAML支持HotReloadSkia and HarfBuzz backends已完成Vello backend实验中(只支持CPU模式)所有模块都差不多完成了迁移目前正在创新Vello的渲染后端。这个在Avalonia里是没有的。官方目前就焊死在Skia上了。似乎并不太像提供新的后端。3.3方法完整性从最小单位函数成员层次看。口径总数已完成说明范围内的上游成员36,21030,354 移植 5,856 有据豁免 0 缺失83.8% 真正写了代码16.2% 写了为什么不写关键路径子系统33 个29 完成 / 3 部分 / 1 进行中三个 partial 是 XAML 热重载、ControlCatalog、浏览器上游测试方法7,5107,363 按名匹配 147 豁免覆盖率 100%上游示例工程30 个24 已移植6 个是 Mac Catalyst、tvOS、WPF 互操作这类不该移植的3.4 平台支持9大平台包括移动端。都已经可以跑了。不过最完善的还是桌面端三、项目实测下载今天早上最新代码编译之后实测截图如下列表视图TreeListAndriod平台Web端编写方式具体研究下代码的编写方式有哪里不一样通知属性useferroui_base::data::model::{Event,INotifyDataErrorInfo,INotifyPropertyChanged};useferroui_base::reactive::AnonymousObserver;useferroui_base::{ferro_markup_type,BoxedValue};usemini_mvvm::{PropertyChangedExtensions,ViewModelBase};usestd::cell::{Cell,RefCell};usestd::rc::Rc;pubstructIndeiErrorViewModel{base:ViewModelBase,maximum:Celli32,value:Celli32,value_error:RefCellOptionString,errors_changed:Eventstr,}implPartialEqforIndeiErrorViewModel{fneq(self,other:Self)-bool{std::ptr::eq(self,other)}}implINotifyPropertyChangedforIndeiErrorViewModel{fnproperty_changed(self)-Eventstr{self.base.property_changed()}}通过·INotifyPropertyChanged的trait来实现。和我们Avalonia也是一样的。XamlUserControlxmlnshttps://github.com/ferrouixmlns:xhttp://schemas.microsoft.com/winfx/2006/xamlxmlns:viewModelsusing:ControlCatalog.ViewModelsx:ClassControlCatalog.Views.CustomNotificationViewx:DataTypeviewModels:NotificationViewModelBorderPadding12MinHeight20BackgroundDodgerBlueGridColumnDefinitionsAuto,*PanelMargin0,0,12,0Width25Height25VerticalAlignmentTopTextBlockText#xE115;FontFamilySegoe UI SymbolFontSize20TextAlignmentCenterVerticalAlignmentCenter//PanelDockPanelGrid.Column1TextBlockDockPanel.DockTopText{Binding Title}FontWeightMedium/StackPanelSpacing20DockPanel.DockBottomMargin0,8,0,0OrientationHorizontalButtonContentNoDockPanel.DockRightNotificationCard.CloseOnClickTrueCommand{Binding NoCommand}Margin0,0,8,0/ButtonContentYesDockPanel.DockRightNotificationCard.CloseOnClickTrueCommand{Binding YesCommand}//StackPanelTextBlockText{Binding Message}TextWrappingWrapOpacity.8Margin0,8,0,0//DockPanel/Grid/Border/UserControl三、总结这个项目给人一种惊喜而且心安的感觉。Avaloina是很成熟的UI框架稳定和功能自不必多说。站在巨人肩上起步会容易不少。何况项目本身还有不少亮点对C#编程太很友好预览器正在开发中。天生的AOT。支持Vello的渲染后端Gpu/Cpu/Hyper,三种模式都支持。今天分享就到这里了你觉得FerroUI这次有前途吗会不会能和GPUI竞争的一下子呢欢迎评论区告诉我。