https://blog.csdn.net/u012563853/article/details/128020416

Avalonia,读:阿瓦隆尼亚

这里的跨平台指的是,使用c#语言开发跨Linux平台。c#在Windows桌面开发中很强,但是在Linux桌面中,不能跨平台,Qt可以在Linux中跨平台,但是那是另外一门语言了。Avalonia类似使用WPF的技术方法来开发,所以,需要会使用WPF,其中的一些语法和写法与WPF有所区别,但是他们相差不大,会WPF的话,基本上可以看看文档后,完全掌握Avalonia的使用,从而达到跨平台开发的任务。

官网的资料是:Welcome - Avalonia UI

1.安装Avalonia,打开vs2022,选择管理拓展,点击下载,安装

2. 安装完成后,重启VS2022,我们可以看到1和2,其中1是使用MVVM模式开发,2是普通模式开发,我们选择2,建立项目

3.完成建立项目,我们看到它的结构和WPF程序结构差不多

其中解决方案中自动引用了一些包 ,并且这些包版本都非常的低,说明还不够成熟

4.接下来,我们创建一个按钮,点击按钮弹出一个框

点击右键,增加新建项,选择Avalonia,可以看到,目前可以选择这些项。

我们选择一个Windows弹框,界面加载非常的慢,可能还是不成熟的问题吧,过一会儿就好了

然后在主界面增加一个按钮,这里记得要增加按钮的事件,否则会报错,而且也不够智能化,应该还是不够成熟。其实写法有些不一样,可以参考官网的说明,进行修改。

Programming with Avalonia - Avalonia UI

然在cs文件中写弹出的代码

5.我们点击运行,先在Windows中看看效果。

6. 这里把代码贴出来,在Ubuntu系统中,运行的时候,会报错,加上代码就可以了。

App.axaml.cs中增加最后一个方法

using Avalonia;
using Avalonia.Controls.ApplicationLifetimes;
using Avalonia.Markup.Xaml;
using Avalonia.Platform;

namespace AvaloniaApplication1
{
public partial class App : Application
{
public override void Initialize()
{
AvaloniaXamlLoader.Load(this);
}

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

base.OnFrameworkInitializationCompleted();
}
public override void RegisterServices()
{
AvaloniaLocator.CurrentMutable.Bind<IFontManagerImpl>().ToConstant(new CustomFontManagerImpl());
base.RegisterServices();
}
}
}

CustomFontManagerImpl.cs

using Avalonia.Media;
using Avalonia.Platform;
using Avalonia.Skia;
using SkiaSharp;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AvaloniaApplication1
{
public class CustomFontManagerImpl : IFontManagerImpl
{
private readonly Typeface[] _customTypefaces;
private readonly string _defaultFamilyName;

//Load font resources in the project, you can load multiple font resources
private readonly Typeface _defaultTypeface =
new Typeface("resm:AvaloniaApplication1.Assets.Fonts.msyh#微软雅黑");

public CustomFontManagerImpl()
{
_customTypefaces = new[] { _defaultTypeface };
_defaultFamilyName = _defaultTypeface.FontFamily.FamilyNames.PrimaryFamilyName;
}

public string GetDefaultFontFamilyName()
{
return _defaultFamilyName;
}

public IEnumerable<string> GetInstalledFontFamilyNames(bool checkForUpdates = false)
{
return _customTypefaces.Select(x => x.FontFamily.Name);
}

private readonly string[] _bcp47 = { CultureInfo.CurrentCulture.ThreeLetterISOLanguageName, CultureInfo.CurrentCulture.TwoLetterISOLanguageName };

public bool TryMatchCharacter(int codepoint, FontStyle fontStyle, FontWeight fontWeight, FontFamily fontFamily,
CultureInfo culture, out Typeface typeface)
{
foreach (var customTypeface in _customTypefaces)
{
if (customTypeface.GlyphTypeface.GetGlyph((uint)codepoint) == 0)
{
continue;
}

typeface = new Typeface(customTypeface.FontFamily.Name, fontStyle, fontWeight);

return true;
}

var fallback = SKFontManager.Default.MatchCharacter(fontFamily?.Name, (SKFontStyleWeight)fontWeight,
SKFontStyleWidth.Normal, (SKFontStyleSlant)fontStyle, _bcp47, codepoint);

typeface = new Typeface(fallback?.FamilyName ?? _defaultFamilyName, fontStyle, fontWeight);

return true;
}

public IGlyphTypefaceImpl CreateGlyphTypeface(Typeface typeface)
{
SKTypeface skTypeface;

switch (typeface.FontFamily.Name)
{
case FontFamily.DefaultFontFamilyName:
case "微软雅黑": //font family name
skTypeface = SKTypeface.FromFamilyName(_defaultTypeface.FontFamily.Name); break;
default:
skTypeface = SKTypeface.FromFamilyName(typeface.FontFamily.Name,
(SKFontStyleWeight)typeface.Weight, SKFontStyleWidth.Normal, (SKFontStyleSlant)typeface.Style);
break;
}
//解决linux系统下skTypeface是null
if (skTypeface == null)
{
skTypeface = SKTypeface.FromFamilyName(_defaultTypeface.FontFamily.Name);
}
//如果是centos7之类的使用linux里面的字体
//if (skTypeface == null)
//{
// skTypeface = SKTypeface.FromFamilyName("WenQuanYi Micro Hei");
//}

return new GlyphTypefaceImpl(skTypeface);
}
}
}

7.我们右键项目,选择发布,选择文件夹

对参数进行配置,如图所示

这里选择独立,这样就不用安装.net6的环境了。生成单个文件,就是只有一个文件。

8.点击保存,然后发布,打开文件夹,把文件夹复制到Linux系统中

9.我这里使用的是Ubuntu 64位系统,版本20.04.4LTS

我们把整个文件夹复制进来后,在命令窗口输入以下命令

./AvaloniaApplication1

10.然后点击回车按钮,就看到了效果,和Windows显示的标题栏还是有区别的

拓展

上面的例子是使用命令的方式启动程序,我们以安装的方式在Ubuntu系统中启动程序。

1.首先进入项目中,使用cmd打开

2.打开cmd,输入命令

dotnet tool install --global dotnet-deb

3. 进入项目根目录中

4.执行命令

dotnet deb install

5.再执行命令

dotnet restore -r linux-x64

6. 最后执行命令,注意版本

dotnet msbuild AvaloniaApplication1.csproj /t:CreateDeb /p:TargetFramework=net6.0 /p:RuntimeIdentifier=linux-x64 /p:Configuration=Release

7.找到路径,可以把整个linux-x64复制到Ubuntu中

8.依然可以使用命令的方式运行

9.直接双击粉红色的文件,进行安装,输入密码,但是美中不足的是,好像没有图标,图标似乎需要单独去设置。

来源:使用Avalonia跨Linux平台-CSDN博客
————————————————
版权声明:本文为CSDN博主「故里2130」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u012563853/article/details/128020416

使用Avalonia跨Linux平台的更多相关文章

  1. ASP.NET MVC5 怒跨 Linux 平台

    安装CentOS 安装Mono #安装yum工具包 yum -y install yum-utils #通过rpm添加Mono源 rpm --import "http://keyserver ...

  2. 转:一个跨WINDOWS LINUX平台的线程类

     来源:http://blog.csdn.net/dengxu11/article/details/7232681 继Windows下实现一个CThread封装类之后,这里我再实现一个跨WINDOWS ...

  3. 解决跨操作系统平台JSON中文乱码问题

    解决跨操作系统平台JSON中文乱码问题 LINUX统一使用utf-8编码,WINDOWS却不是. LINUX中间件,传输JSON给WINDOWS程序,会乱码. 解决办法: 对JSON字段是字符串类型的 ...

  4. Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part3:db安装和升级

    Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part3:db安装和升级 环境:OEL 5.7 + Oracle 10.2.0.5 RAC 5.安装Database软件 5. ...

  5. Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part1:准备工作

    Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part1:准备工作 环境:OEL 5.7 + Oracle 10.2.0.5 RAC 1.实施前准备工作 1.1 服务器安装操 ...

  6. Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part2:clusterware安装和升级

    Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part2:clusterware安装和升级 环境:OEL 5.7 + Oracle 10.2.0.5 RAC 3.安装Clus ...

  7. 在linux平台实现atosl

    ➠更多技术干货请戳:听云博客 序言 怎么在linux 平台下实现一个类似于mac 平台下的 atos 工具( iOS 符号化解析)? 分析问题 在github上找到了几年前的开源实现,[https:/ ...

  8. Linux平台oracle 11g单实例 + ASM存储 安装部署 快速参考

    操作环境:Citrix虚拟化环境中申请一个Linux6.4主机(模板)目标:创建单机11g + ASM存储 数据库 1. 主机准备 2. 创建ORACLE 用户和组成员 3. 创建以下目录并赋予对应权 ...

  9. Linux平台 Oracle 11gR2 RAC安装Part1:准备工作

    一.实施前期准备工作 1.1 服务器安装操作系统 1.2 Oracle安装介质 1.3 共享存储规划 1.4 网络规范分配 二.安装前期准备工作 2.1 各节点系统时间校对 2.2 各节点关闭防火墙和 ...

  10. Linux平台 Oracle 11gR2 RAC安装Part2:GI安装

    三.GI(Grid Infrastructure)安装 3.1 解压GI的安装包 3.2 安装配置Xmanager软件 3.3 共享存储LUN的赋权 3.4 使用Xmanager图形化界面安装GI 3 ...

随机推荐

  1. UPS 6航班空难分析与总结

    1. 事件概况 事故时间:2008年9月3日 事故地点:阿联酋迪拜国际机场附近 机型:波音747-400F(货运型) 航班编号:UPS 6 机组成员:2人(1名机长和1名副驾驶) 机上人员伤亡:机组人 ...

  2. 【前端AI实践】简说AI大模型:什么时代了你还不会这些AI大模型的基本概念和使用吗

    如果你是前端开发者,可能已经用过像 ChatGPT.GitHub Copilot 这样的 AI 工具.它们背后都有一个核心能力在支撑:AI 大模型. 那这个"大模型"到底是个啥?它 ...

  3. 如何在FastAPI中玩转GitHub认证,让用户一键登录?

    title: 如何在FastAPI中玩转GitHub认证,让用户一键登录? date: 2025/06/22 09:11:47 updated: 2025/06/22 09:11:47 author: ...

  4. C#脚本化(Roslyn):如何在运行时引入nuget包

    假设我们开发了一个C#脚本编辑器,利用Roslyn去执行用户所编写的脚本.这时候,如果用户想要引用一个nuget包,应该如何实现呢? 我们想要引用nuget包的话,只要能得到nuget包及其依赖包的所 ...

  5. axios Post请求 .Net Core中的接口以及FromBody特性和FromForm特性的使用

    转载于:https://juejin.im/post/5cdab497e51d453adf1fa729 转载于:https://blog.csdn.net/weixin_34129145/articl ...

  6. Sql server 左连接查询最大记录

    SELECT * FROM Billcode_in a LEFT JOIN Billcode_place b ON a.billcode=b.billcode AND b.id=(SELECT MAX ...

  7. 前端 Git Commit & branchs 规范

    前端 Git Commit & branchs 规范 1.分支 master 分支为主分支(保护分支)不能直接在master分支上进行修改代码和提交:且master分支为线上版本分支,代码只能 ...

  8. 利用爬虫js逆向破解网易云制作播放器

    目标网易云音乐 详情见B站教程https://www.bilibili.com/video/BV18V4y1T79F?p=14 还有这两篇https://blog.csdn.net/zly717216 ...

  9. 如何本地部署Deepseek大模型

    本地部署Deepseek大模型 1.下载Ollama 去ollama官网https://ollama.com/ 下载可执行程序,可选macos.linux和Windows版本下载 下载之后如果点击直接 ...

  10. 2024年1月份更新「GIS数据」全国的GeoJSON、shp格式数据下载获取(精确到乡镇街道级)

    发现个可以免费下载全国 geojson 数据的网站,推荐一下.支持全国.省级.市级.区/县级.街道/乡镇级以及各级的联动数据,支持导入矢量地图渲染框架中使用,例如:D3.Echarts等 geojso ...