Avalonia UI 升级至 11.0 注意事项 Q&A

[删除(380066935@qq.com或微信通知)]

更好的阅读体验请查看原文:https://www.cnblogs.com/rabbitdong/p/16907648.html

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

这样做有两点考虑:

  1. Avalonia的设计高度模块化,所以控件其实是没有样式的。Fluent主题只是为控件提供了一种的样式,因此可以分开发布。
  2. 瘦身。在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就不会生成这个方法,那么就不会自动附加调试工具。你可以二选一

  1. 选择删除模板带的InitializeComponent()方法,改为由SourceGenerator自动生成
  2. 自己手动添加上面的代码。