Avalonia开发笔记(2024/5/20更新)

官网:

https://avaloniaui.net/

源码:

https://github.com/AvaloniaUI/Avalonia

目前最新版本:11.0.10

常用控件

CgdataBase.Avalonia

自己写的基础库控件,里面是自己平常经常用的基础函数。

Install-Package CgdataBase.Avalonia

OxyPlot.Avalonia

开源的曲线图控件
OxyPlot.Avalonia需要下面的版本:

Install-Package OxyPlot.Avalonia -Version 2.1.0-Avalonia11

LiveCharts2

开源的曲线图控件

Install-Package LiveChartsCore.SkiaSharpView.Avalonia

Avalonia.AvaloniaEdit

开源的文本和代码编辑器控件

Install-Package Avalonia.AvaloniaEdit

Dock.Avalonia

开源的dock控件

Install-Package Dock.Avalonia
Install-Package Dock.Model.Mvvm

ThemeEditor.Controls.ColorPicker

开源的颜色选择器控件

Install-Package ThemeEditor.Controls.ColorPicker

Material.Avalonia

Install-Package Material.Avalonia

https://github.com/AvaloniaCommunity/Material.Avalonia

Avalonia.Controls.DataGrid

Install-Package Avalonia.Controls.DataGrid

DialogHost.Avalonia

Install-Package DialogHost.Avalonia

ShowMeTheXaml.Avalonia

Install-Package ShowMeTheXaml.Avalonia

目前我们已经拿Avalonia做了好几个跨平台的项目。跟WPF非常相似,还是挺不错的。
并且这个平台一直在更新,从开始接触到现在,也是已经升级了好多个版本。
很多第三方的控件和开发库都基于Avalonia进行了移植。常规的开发基本上没啥问题。
类似曲线图等控件,可选用OxyPlot或LiveCharts2。

从0.10升级到11.0.x版本

版本升级的官方帮助文档,说明版本说明时需要修改的一些东西。
https://docs.avaloniaui.net/zh-Hans/docs/next/stay-up-to-date/upgrade-from-0.10

编辑器推荐

Visual Studio 2022 + Avalonia for Visual Studio 2022

需要安装一个插件,但是XAML界面下,代码提示功能比较弱,基本上算没有,写起来不是很方便。

JetBrains Rider

目前最新版本是2021版本,本身是商用,可以试用30天。JetBrains Rider的代码提示功能做得挺不错的,不过代码调试有时候没VS方便,可以两个IDE结合起来使用。
如果是在Linux系统下开发,因为没有VS编译器可用,感觉JetBrains Rider会是最好的选择,相比较VS Code,集成度会更高,代码提示等方面都会做得更好一点。

VS Code

VS Code开源免费,各个操作系统都支持,在Linux等操作系统下也是一个不错的选择。可以用VS Code编辑代码,然后用dotnet来编译执行。
不过我用的比较少,现在大部分时候还是在Windows上开发完,然后拿到Linux上执行和调试。

系统测试情况

目前试了一下,能够正常运行的系统,除了Windows系统外,流行的Ubuntu,Centos,Redhat这些系统应该都没啥问题。
目前因为国产化要求,经常需要运行在银河麒麟系统下,目前测试了没有啥问题。
在Linux系统可能会出现因为找不到字体运行失败的问题,需要指定一下字体。
Avalonia 11.0.0版本之后,处理的方式会有差异。

Avalonia的应用可以打包成deb安装包。也可以基于软件包设置桌面图标,操作方法参考:

Ubuntu系统下为Avalonia应用创建桌面图标 - wzwyc - 博客园
https://www.cnblogs.com/wzwyc/p/14820893.html

相关的开源项目

Avalonia资源

https://github.com/AvaloniaCommunity/awesome-avalonia?tab=readme-ov-file

Gotrays.Suspension

Gotrays Suspension 作为open666.cn的客户端生态,以开源给用户使用,使用avalonia实现跨平台,支持在Win,Linux,Mac下运行。
https://github.com/239573049/Suspension

Core2D

GitHub - wieslawsoltes/Core2D: A multi-platform data driven 2D diagram editor.
https://github.com/wieslawsoltes/Core2D

Avalonia内置控件的示例程序

https://github.com/AvaloniaUI/ControlCatalogStandalone.git

FAQ常见问题解决

1、“Default font family name can't be null or empty.”报错

Avalonia 11.0.0的处理方式:

public static AppBuilder BuildAvaloniaApp()
{
    var Settings = AppSettings.Instance;
    FontManagerOptions options = new();
    if (OperatingSystem.IsLinux())
    {
        options.DefaultFamilyName = Settings.LinuxFamilyName;
    }
    else if (OperatingSystem.IsMacOS())
    {
        options.DefaultFamilyName = Settings.MacOSFamilyName;
    }
    else if (OperatingSystem.IsWindows())
    {
        options.DefaultFamilyName = Settings.WindowsFamilyName;
    }

    return AppBuilder.Configure<App>()
                .UsePlatformDetect()
                .LogToTrace()
                .WithInterFont()
                .UseReactiveUI()
                .With(options);
}

2、打包成deb安装包

Avalonia的应用可以打包成deb安装包。也可以基于软件包设置桌面图标,操作方法参考:
Ubuntu系统下为Avalonia应用创建桌面图标 - wzwyc - 博客园
https://www.cnblogs.com/wzwyc/p/14820893.html

3、窗体的快捷键设置

<Button
    Classes="select"
    Command="{Binding AddCommand}"
    Content="添加"
    HotKeyManager.HotKey="Ctrl+N" />
<Button
    Classes="select"
    Command="{Binding EditCommand}"
    Content="编辑"
    HotKeyManager.HotKey="F2" />
<Button
    Classes="select"
    Command="{Binding DeleteCommand}"
    Content="删除"
    HotKeyManager.HotKey="Delete" />
<Button
    Classes="select"
    Command="{Binding RefreshCommand}"
    Content="刷新"
    HotKeyManager.HotKey="F5" />

在按钮上设置HotKeyManager.HotKey的值。

4、CalendarDatePicker

WPF里面的DatePicker控件,在Avalonia里面对应的应该是CalendarDatePicker。

<CalendarDatePicker SelectedDate="{Binding StartTime}" />

前面一直在用Avalonia的DatePicker,别扭。

获取控件的窗体

    public static Window GetWindow(Visual visual)
    {
        return Avalonia.VisualTree.VisualExtensions.FindAncestorOfType<Window>(visual);
    }

对话框关闭的时候提示线程不正确

Avalonia是从0.10.x版本开始用,所以习惯了用ReactiveUI模式。
新项目一开始需要使用Dock控件,找了Dock.Avalonia库。因为这个库示例只有CommunityToolkit.Mvvm的示例,所以工程用的是CommunityToolkit.Mvvm。
后面又用了Prism.Avalonia框架。
然后又用了PropertyChanged.Fody和ReactiveUI.Fody。
估计引入的东西太多了,有点冲突了。
后面重新建一下,改成了ReactiveUI,保留Prism.Avalonia和ReactiveUI.Fody,然后就正常了。

Avalonia for Visual Studio 2022插件的安装

Avalonia for Visual Studio 2022的VS插件安装的时候经常会一直卡在那里,无法完成安装。
解决办法是:先把安装包的扩展名改成.zip,然后打开压缩包,删除里面的Extension.vset文件,然后再把扩展名重新改回.vsix。

Avalonia中文字体的设置

安装:

Install-Package Quick.AvaloniaFonts.SourceHanSansCN

把.WithInterFont()替换为.WithFont_SourceHanSansCN()即可。
示例代码:

class Program
{
    [STAThread]
    public static void Main(string[] args) => BuildAvaloniaApp()
        .StartWithClassicDesktopLifetime(args);

    public static AppBuilder BuildAvaloniaApp()
        => AppBuilder.Configure<App>()
            .UsePlatformDetect()
            //.WithInterFont()
            .WithFont_SourceHanSansCN()
            .LogToTrace();
}

Avalonia自带的消息提示管理系统

主要是借助WindowNotificationManager类,示例代码:

public partial class App : Application
{
    private static WindowNotificationManager? _manager;

    public override void Initialize()
    {
        AvaloniaXamlLoader.Load(this);
    }

    public override void OnFrameworkInitializationCompleted()
    {
        if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
        {
            desktop.MainWindow = new MainWindow
            {
                DataContext = new MainViewModel()
            };

            _manager = new WindowNotificationManager(desktop.MainWindow) { MaxItems = 3 };
        }
        else if (ApplicationLifetime is ISingleViewApplicationLifetime singleViewPlatform)
        {
            singleViewPlatform.MainView = new MainView
            {
                DataContext = new MainViewModel()
            };
        }

        base.OnFrameworkInitializationCompleted();
    }

    public static void ShowNotification(string title, string message, NotificationType type)
    {
        _manager?.Show(new Notification(title, message, type));
    }
}

可以直接修改ViewModelBase类,增加调用的接口:

public class ViewModelBase : ReactiveObject
{
    public void ShowError(string message)
    {
        App.ShowNotification("错误", message, NotificationType.Error);
    }

    public void ShowMessage(string message)
    {
        App.ShowNotification("提示", message, NotificationType.Information);
    }
}

控件事件的绑定

安装包:

Install-Package Avalonia.Xaml.Behaviors

添加引用:

xmlns:i="clr-namespace:Avalonia.Xaml.Interactivity;assembly=Avalonia.Xaml.Interactivity"
xmlns:ia="clr-namespace:Avalonia.Xaml.Interactions.Core;assembly=Avalonia.Xaml.Interactions"

命令绑定:

<ListBox
    Classes="style1"
    ItemsSource="{Binding Items}"
    SelectedItem="{Binding SelectedItem}">
    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
            <WrapPanel />
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>

    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBlock
                Width="200"
                Margin="2"
                Classes="style1"
                Text="{Binding ClassName}" />
        </DataTemplate>
    </ListBox.ItemTemplate>

    <i:Interaction.Behaviors>
        <ia:EventTriggerBehavior EventName="DoubleTapped">
            <ia:InvokeCommandAction Command="{Binding SubmitCommand}" />
        </ia:EventTriggerBehavior>
    </i:Interaction.Behaviors>
</ListBox>

然后ViewModel中对相应的命令进行声明定义即可。

应用图标

包安装:

Install-Package Projektanker.Icons.Avalonia
Install-Package Projektanker.Icons.Avalonia.FontAwesome
Install-Package Projektanker.Icons.Avalonia.MaterialDesign

在Program类中添加:

public static AppBuilder BuildAvaloniaApp()
{
    IconProvider.Current.Register<FontAwesomeIconProvider>().Register<MaterialDesignIconProvider>();

    return AppBuilder.Configure<App>()
                .UsePlatformDetect()
                .LogToTrace()
                .WithFont_SourceHanSansCN()
                .UseReactiveUI();
}

界面代码:

xmlns:icons="https://github.com/projektanker/icons.avalonia"

<Button
    icons:Attached.Icon="fa-sliders"
    Classes="icon"
    Command="{Binding SettingsCommand}"
    FontSize="{Binding FontSize}" />
<Button
    icons:Attached.Icon="fa-circle-question"
    Classes="icon"
    Command="{Binding AboutCommand}"
    FontSize="{Binding FontSize}" />
<Button
    icons:Attached.Icon="fa-power-off"
    Classes="icon"
    Command="{Binding QuitCommand}"
    FontSize="{Binding FontSize}" />
posted @ 2023-07-24 20:07  wzwyc  阅读(4482)  评论(4编辑  收藏  举报