Avalonia UI 升级至 11.0 注意事项 Q&A
Q1: 更改V11后无法编译,显示FluentTheme不存在
答:当前Avalonia UI V11.0 仍处于预览阶段,因此Visual Studio和Rider插件中的默认模板仍然没有更新。如果通过默认模板创建项目并修改为Avalonia版本为11.0-previewX后可能导致无法运行。
这是因为在V11中Avalonia团队决定将FluentTheme以单独的nuget包分发。需要在项目中引入Avalonia.Themes.Fluent
dotnet add package Avalonia.Themes.Fluent --version 11.0.0-preview4
这样做有两点考虑:
- Avalonia的设计高度模块化,所以控件其实是没有样式的。Fluent主题只是为控件提供了一种的样式,因此可以分开发布。
- 瘦身。在Fluent主题中大多数体积都是默认的字体,如果不需要Fluent主题则可以减小应用的大小。
Q2: ClipToBounds 失效
答:当前V11中默认启用了Compisition Render,仍然有bug,导致ClipToBounds失效。需要禁用。在Program.cs中修改如下
public static AppBuilder BuildAvaloniaApp()
=> AppBuilder.Configure<App>()
.UsePlatformDetect()
.With(new Win32PlatformOptions(){ UseCompositor = false}) // 增加此行
.LogToTrace();
Q3: 在Linux下启动显示default font family is not be null or empty
答:请参考博文 https://www.cnblogs.com/joyandjoys/p/14346935.html
具体实现可以参考 https://github.com/AvaloniaUI/Avalonia/blob/master/tests/Avalonia.Skia.UnitTests/Media/CustomFontManagerImpl.cs
来源 https://github.com/AvaloniaUI/Avalonia/issues/4427#issuecomment-761560587
Q4: DataGrid在调试时正常显示,发布后消失
答:emm,一个离谱的问题。DataGrid之所以能够在调试时正常显示,是因为在调试时候附着了Avalonia DevTool,其中用到了DataGrid的SimpleTheme。但在发布之后,DevTool在条件编译中移除,因此DataGrid的样式也就没有引入到项目中。需要记得手动引入DataGrid的样式。
需要手动引用样式
avares://Avalonia.Controls.DataGrid/Themes/Fluent.xaml
或
avares://Avalonia.Controls.DataGrid/Themes/Simple.xaml
Q5: TextBlock在Rider中如下写法会报错,但能编译运行
<TextBlock>Hello World</TextBlock>
答:只是Rider IDE的问题。但是在preview4后,这个问题就不存在了。见Q6。
具体来说,在编辑器中一个XAML元素是否可以有Content是由多方面决定的。在WPF中,由ContentPropertyAttribute来决定,在Avalonia中由ContentAttribute来决定。只有用Attribute特性规定了什么可以作为这个元素的Content,才可以在XAML中这样写。
对于TextBlock有一个尴尬的问题。在preview4之前,RickTextBlock继承自TextBlock,TextBlock作为Content的应是Text属性,RichTextBlock作为Content的应是Inline属性。但非常不幸的是,Avalonia的XAML编译要求一个类不能同时拥有两个标记为Content的属性。于是为了让派生类RichTextBlock的Inline能作为Content,就不得不舍弃了基类TextBlock的Text作为Content的可能性。
在WPF中,这个问题是通过IAddChild接口来解决的。Visual Studio同样也会考虑这个接口的存在。但在Rider中并没有对这个接口的支持。
在Preview4之后,TextBlock不只有Text,也有了Inline作为Content,这个问题突然就不存在了。
Q6: RickTextBlock 被删除了
答:是的,从preview4开始,RickTextBlock的功能被合并进入了TextBlock,新增了SelectableTextBlock。
Q7: HasSystemDecorations 属性被删除了
答:是的,可以改为使用System.Decorations="None"
Q8: 如何开启DevTools(调试工具)?
答:F12
如果你引用了XamlNameReferenceGenerator,那么会自动通过SourceGenerator在生成的IntializeComponent()
方法中为Debug的时候附加调试工具,可以直接F12打开使用。
如果你没有引用,那么就需要在MainWindow手动添加如下代码
public MainWindow()
{
InitializeComponent();
#if DEBUG
this.AttachDevTools(); // 增加这一行
#endif
}
注意:如果你引用了XamlNameReference但用了老版本插件自动生成的用户控件模板,那么有可能在代码中已经有了InitializeComponent()
方法,那么SourceGenerator就不会生成这个方法,那么就不会自动附加调试工具。你可以二选一
- 选择删除模板带的
InitializeComponent()
方法,改为由SourceGenerator自动生成 - 自己手动添加上面的代码。