几个优势:
- 自绘控件
- 支持 Windows, MAC, Linux, Android, Web
- 支持 Native AOT
比较
- 虽然控件不及 Flutter 的丰富, 但也是自绘的, 各个平台可以做到统一, 重要的是, 它是 .NET 的一员.
- 同时又能像 Xamarin / MAUI 一样, 支持多个平台,。因为是自绘控件, 界面又比 MAUI 统一, 而且 XAML 语法又和 WPF/Xamarin/MAUI 高度相似, 学习起来不费力气。
- 最重要的一点, 完全支持 Native AOT。 MAUI 也挺好的,但是 WIN 10 以前的系统不支持,WPF 也挺好的, 但是不支持 AOT。
- Avalonia UI 11 + .NET8 用 AOT 编译出来的 exe 文件成功运行于 WIN2008 R2 上。
知识点,备忘
// 从当前控件获取 TopLevel。或者,您也可以使用 Window 引用。
var topLevel = TopLevel.GetTopLevel(this);
// 启动异步操作以打开对话框。
var files = await topLevel.StorageProvider.OpenFilePickerAsync(new FilePickerOpenOptions
{
Title = "Open Text File",
AllowMultiple = false
});
- 主题 Theme:
https://docs.avaloniaui.net/zh-Hans/docs/next/basics/user-interface/styling/themes/
https://theme.xaml.live/
https://github.com/AvaloniaCommunity/Material.Avalonia
- ReactiveCommand
https://docs.avaloniaui.net/zh-Hans/docs/next/guides/data-binding/how-to-bind-can-execute
可以直接将 Command 绑定到方法上,
https://docs.avaloniaui.net/zh-Hans/docs/next/guides/data-binding/how-to-bind-to-a-command-without-reactiveui
- 资产:
https://docs.avaloniaui.net/zh-Hans/docs/next/basics/user-interface/assets
如果资产包含在与XAML文件不同的程序集中,则可以使用 avares: URI方案。例如,如果资产包含在名为MyAssembly.dll的程序集中的Assets文件夹中,则可以使用:
<Image Source="avares://MyAssembly/Assets/icon.png"/>
通过在该项组中添加额外的<AvaloniaResource>元素来包含所需的任何文件
<ItemGroup>
<AvaloniaResource Include="Assets\**"/>
</ItemGroup>
<Image Source="icon.png"/>
<Image Source="images/icon.png"/>
<Image Source="../icon.png"/>
<Image Source="/Assets/icon.png"/>
加载网络图片:
https://github.com/AvaloniaUtils/AsyncImageLoader.Avalonia
- 手势,触控
https://docs.avaloniaui.net/zh-Hans/docs/next/basics/user-interface/multi-touch
https://docs.avaloniaui.net/zh-Hans/docs/next/concepts/input/gestures
https://docs.avaloniaui.net/zh-Hans/docs/next/reference/gestures/
- 绑定:
https://docs.avaloniaui.net/zh-Hans/docs/next/basics/data/data-binding/data-binding-syntax
编译绑定, 默认未启用。
https://docs.avaloniaui.net/zh-Hans/docs/next/basics/data/data-binding/compiled-bindings
x:DataType="vm:MyViewModel"
x:CompileBindings="True"
<!-- 使用CompiledBinding标记进行绑定 -->
<TextBox Text="{CompiledBinding LastName}" />
<!-- 这个命令将使用ReflectionBinding,因为它是默认值 -->
<Button Content="Send an E-Mail" Command="{Binding SendEmailCommand}" />
<!-- 我们使用ReflectionBinding -->
<Button Content="Send an E-Mail" Command="{ReflectionBinding SendEmailCommand}" />
全局编译绑定设置, 启用AOT 时, 最好使用 CompiledBinding, 否则会因为裁剪导致找不到属性的错误:
<AvaloniaUseCompiledBindingsByDefault>true</AvaloniaUseCompiledBindingsByDefault>
绑定到控件:
https://docs.avaloniaui.net/zh-Hans/docs/next/guides/data-binding/binding-to-controls
<TextBox Name="other">
<!-- 绑定到命名为 other 控件的 Text 属性 -->
<TextBlock Text="{Binding #other.Text}"/>
<TextBlock Text="{Binding Text, ElementName=other}"/>
$parent
<Border Tag="Hello World!">
<TextBlock Text="{Binding $parent.Tag}"/>
</Border>
<Border Tag="Hello World!">
<Border>
<TextBlock Text="{Binding $parent[1].Tag}"/>
</Border>
</Border>
索引从0开始,因此 $parent[0]
等同于 $parent
。
<Border Tag="Hello World!">
<Decorator>
<TextBlock Text="{Binding $parent[Border].Tag}"/>
</Decorator>
</Border>
<Border Tag="Hello World!">
<Border>
<Decorator>
<TextBlock Text="{Binding $parent[Border;1].Tag}"/>
</Decorator>
</Border>
</Border>
<TextBlock Text="{x:Static assets:Resources.GreetingText}"/>
在上面的示例中,GreetingText 是与 ResX 文件中的字符串对应的键。{x:Static} 标记扩展用于引用在 .NET 类中定义的静态属性,而在这种情况下,即资源文件(assets:Resources.GreetingText)。
- 使用 MVVM Toolkit 简化 INotifyPropertyChanged
https://docs.avaloniaui.net/zh-Hans/docs/next/guides/data-binding/inotifypropertychanged
-
Classes
类似 WPF 中的DataTrigger
https://docs.avaloniaui.net/zh-Hans/docs/next/guides/data-binding/binding-classes
- ObservableCollection ObservableObject
https://docs.avaloniaui.net/zh-Hans/docs/next/guides/data-binding/how-to-bind-to-a-collection
- UI 线程
https://docs.avaloniaui.net/zh-Hans/docs/next/guides/development-guides/accessing-the-ui-thread
Dispatcher.UIThread
- CSS 伪类
https://docs.avaloniaui.net/zh-Hans/docs/next/concepts/pseudo-classes
https://docs.avaloniaui.net/zh-Hans/docs/next/reference/styles/pseudo-classes
https://docs.avaloniaui.net/zh-Hans/docs/next/reference/styles/style-selector-syntax
- Insets Manager 手机端
https://docs.avaloniaui.net/zh-Hans/docs/next/concepts/services/insets-manager
SystemBarColor
SystemBarTheme
IsSystemBarVisible
- StorageFile 和 StorageFolder
https://docs.avaloniaui.net/zh-Hans/docs/next/concepts/services/storage-provider/storage-item
- 在WPF中的HierarchicalDataTemplate在Avalonia中被称为TreeDataTemplate
- Avalonia 默认使用的是
Splat
提供的 IoC, 可以使用 Microsoft.Extensions.DependencyInjection 进行替换
https://github.com/reactiveui/splat/tree/main/src/Splat.Microsoft.Extensions.DependencyInjection
https://github.com/AvaloniaUI/Avalonia/discussions/8588
- 源码生成器
https://github.com/dotnet/roslyn/blob/main/docs/features/source-generators.cookbook.md
https://www.cnblogs.com/lindexi/p/16697794.html
https://andrewlock.net/exploring-dotnet-6-part-9-source-generator-updates-incremental-generators/
https://andrewlock.net/creating-a-source-generator-part-4-customising-generated-code-with-marker-attributes/
-
一些 Avalonia 的牛逼项目
https://github.com/AvaloniaCommunity/awesome-avalonia -
NativeAOT Asp.net Core
WebApplication.CreateSlimBuilder
https://learn.microsoft.com/en-us/aspnet/core/fundamentals/native-aot?view=aspnetcore-8.0&preserve-view=true
网友评论