前言

Avalonia是一个强大的框架,使开发人员能够使用.NET创建跨平台应用程序。它使用自己的渲染引擎绘制UI控件,确保在Windows、macOS、Linux、Android、iOS和WebAssembly等不同平台上具有一致的外观和行为。这意味着开发人员可以共享他们的UI代码,并在不同的目标平台上保持统一的外观和感觉。我也尝试过直接将windows开发的项目拿到AnduinOS下直接运行,项目可以直接运行且整体无问题(个别特性除外,如官方提供的亚克力模糊效果会失灵直接变成透明)。Avalonia对于接触过WPF开发人员也相对友好,有类似开发体验部分地方要优于WPF。

准备开发环境

  1. 安装Rider 参考AnduinOS文档:https://docs.anduinos.com/Applications/Code-Editors/Jetbrains-Rider/Jetbrains-Rider.html
  2. 安装Avalonia UI模板和可视化编辑器 Avalonia UI模板参考官方文档:https://docs.avaloniaui.net/zh-Hans/docs/get-started/install 编辑器可在rider插件中搜索“AvaloniaRider”进行安装 如果插件中为搜索到“AvaloniaRider”,就需要自己移步github上下载安装了https://github.com/ForNeVeR/AvaloniaRider

创建项目

  1. 安装完Avalonia UI模板后在创建项目时就可以在左侧自定义模板中看到Avalonia了,按照各自的喜好选择模板就好,这里我选择的是Avalonia.NET MVVM App。 注意:在高级设置中有一个MvvmToolkit选项:这里我们选择CommunityToolkit,另一种ReactiveUI感兴趣的自行了解。选择CommunityToolkit可以让你用熟悉的MVVM模式开发应用

  2. 如果有过WPF开发经验的在创建完项目后就能看到熟悉的代码。然后我们在右上角的调出编辑器,新项目的编辑器都需要build一下才会显示。

  3. 到此处基本大家就能按照自己的需求开发软件了。如果想让软件在AnduinOS的系统托盘中显示,可以在APP.axaml或APP.axaml.cs中添加TrayIcon。 在App.axaml中添加:

	<TrayIcon.Icons>
        <TrayIcons>
            <TrayIcon Icon="/Assets/ico_logo.ico"
                      ToolTipText="动态桌面">
                <TrayIcon.Menu>
                    <NativeMenu>
                        <NativeMenuItem  Header="设置" />
                        <NativeMenuItem />
                        <NativeMenuItem Header="关闭"/>
                    </NativeMenu>
                </TrayIcon.Menu>
            </TrayIcon>
        </TrayIcons>
    </TrayIcon.Icons>

在App.axaml.cs中的**OnFrameworkInitializationCompleted()**方法里添加:

		// 创建托盘图标
            var trayIcon = new TrayIcon
            {
                Icon = new WindowIcon(projectRoot),
                ToolTipText = "动态桌面",
                Menu = new NativeMenu
                {
                        new NativeMenuItem("设置")
                        {
                            Command = new RelayCommand(ShowWindow)
                        },
                        new NativeMenuItem("退出")
                        {
                            //Command = new RelayCommand(() => Environment.Exit(0))
                            Command = new RelayCommand(Dispose)
                        }
                    
                }
            };
            //设置系统托盘
            TrayIcon.SetIcons(this, new TrayIcons{trayIcon});

打包项目

官方打包项目方案 我这里使用的是官方推荐第三方打包方法中的一个,其余的方法自行尝试: 第三方打包工具(适用于 Debian / Ubuntu)

  • https://github.com/quamotion/dotnet-packaging
  • https://github.com/SuperJMN/DotnetPackaging
  • https://github.com/kuip

我使用的是dotnet-packaging已经安装过此包,dotnet-packaging支持的打包格式:“zip、tarball、rpm、deb”大家就按照Github上的流程安装就好,过程很简单我就不过多讲述就已deb为例子,直接在rider中的终端里操作:

 //安装
 dotnet tool install --global dotnet-deb
 dotnet deb install
 	
 //打包“打包好的软件会生成项目中的bin/debug/‘.net版本'/中”
dotnet deb

//安装
apt-get install bin\Debug\netcoreapp3.1\my-app.1.0.0.deb

//安装后软件目录:/usr/share/my-app

打包过程中需要注意的是sdk版本 AnduinOS中默认的dotnet版本好像是8.0.102,而我们在项目中使用的时候有可能是.net9或者.net8.0.408。这种情况下会打包失败,所以我们需要管理sdk版本。在Rider中我们可以在解决方案---项目 右键找到‘管理NET SDK’,选择版本会生成一个global.json文件:

	{
		"sdk": {
			"version": "8.0.408",
			"rollForward": "disable",
			"allowPrerelease": true
		}
	}

在这里我们就能对版本进行细致管理,另外切换版本后avalonia编辑器可能不能及时还原依赖,所以我们手动清理还原一下:

    dotnet --list-sdks --已安装的版本
    dotnet --version --确定版本
    dotnet clean --清理
    dotnet restore --还原
    dotnet build 
    dotnet deb --打包

设置图标