使用Avalonia跨Linux平台

news2025/8/12 5:12:24

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

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/33591.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机组成原理4小时速成:计算机运算方法,无符号数和有符号数,定点数和浮点数,移位运算,加减运算,乘法运算,原码,反码,补码

计算机组成原理4小时速成&#xff1a;计算机运算方法&#xff0c;无符号数和有符号数&#xff0c;定点数和浮点数&#xff0c;移位运算&#xff0c;加减运算&#xff0c;乘法运算&#xff0c;原码&#xff0c;反码&#xff0c;补码 2022找工作是学历、能力和运气的超强结合体&…

[激光原理与应用-16]:《激光原理与技术》-2- 光的本质(粒子、波动说、电磁波、量子)

目录 前言&#xff1a;“光” 一、光的微粒说 - 牛顿 二、光的波动说 - 托马斯杨 惠更斯 三、光是电磁波 - 麦克斯韦 四、光的波动说受到的挑战&#xff0c;光的波动说重新唤醒 五、光量子假说 - 爱因斯坦 六、光的理论综合 七、光的重要特性 7.1 光的相干性 7.2 相…

安装ideaIU-2022.1.4报错问题解决办法

原来版本是2020 现在因为要用到JDK17 而IDEA2020支持的JDK只能到14 所以我们现在在下载一个2022 .1.4 这时我们安装好后 会发现如下错误 原因分析&#xff1a; JetBrains 会将各个产品的这些文件也放到这个目录中&#xff0c;而新版本的 IntelliJ IDEA 在安装时遭遇了旧版本…

Web(二)html5基础-文本控制类标签(知识训练和编程训练)

web知识训练_html5_文本控制类标签 第1关_web知识训练_html5_文本控制类标签 -------------------------------------------- web编程训练_html5_文本控制类标签 第1关_html5_网页背景及标题段落标签 编程要求 根据前面的效果图&#xff0c;在右侧编辑器中的Begin - End区域…

10K涨到30K,5年大厂横跳,经验全在这两份Java面试精华总结里了

为了帮助大家跳槽成功多长点薪资&#xff0c;我这边给大家准备了两份面试资料。这两份资料可大有来头&#xff0c;已经帮助五位我认识的人进入大厂。所以说含金量还是很高的。 这两份资料可以让你体验到原有知识从破碎到重建&#xff0c;豁然开朗的过程。5年大厂横跳真实案例加…

数据库事务

1 概述 数据库的事务&#xff08;Transaction&#xff09;是一种机制、一个操作序列&#xff0c;包含了一组数据库操作命令。 事务把所有的命令作为一个整体一起向系统提交或撤销操作请求&#xff0c;即这一组数据库命令要么同时成功&#xff0c;要么同时失败。 事务是一个不可…

前端开发——HTML5新增的客户端校验

1.使用校验属性执行校验 HTML5新增了表单的校验属性,如required、pattern等。 required:定义表单不能为空。属性值是required或者省略.pattern:定义表单满足正则表单式1.required属性 required属性用于不能为空。属性值是required或者省略. 代码如下&#xff1a; <form …

34 - 数组操作符的重载

---- 整理自狄泰软件唐佐林老师课程 1. 问题一 string类对象具备C方式字符串的灵活性吗&#xff1f;还能直接访问单个字符吗&#xff1f; 1.1 字符串类的兼容性 string类最大限度的考虑了C字符串的兼容性可以按照使用C字符串的方式使用string对象 1.2 编程实验&#xff1a…

BUUCTF Reverse/[GWCTF 2019]re3

main函数代码&#xff0c;这里改写了内存空间的属性&#xff0c;还是自解密 void __fastcall __noreturn main(int a1, char **a2, char **a3) {int i; // [rsp8h] [rbp-48h]char s[40]; // [rsp20h] [rbp-30h] BYREFunsigned __int64 v5; // [rsp48h] [rbp-8h]v5 __readfsqwo…

在Thymeleaf中格式化日期

1. 简介 在本文中&#xff0c;我们将介绍在百里香叶模板中格式化日期的方法。我们将使用 Thymeleaf 引擎中提供的特殊#calendars实用程序&#xff0c;该实用程序是为模板上的日期操作而创建的。 2. 使用实用程序类#calendar Thymeleaf带有一个名为#calendars的特殊实用程序类…

万字长文:从实践到原理说透Golang defer

本从以go-1.16版本源码为基础&#xff0c;介绍了defer关键字的使用规则、实现原理和优化路线&#xff0c;最后介绍了几种将近的使用场景。试图对 go defer 关键字应用到实现原理有一个全面的了解。 欢迎关注公众号闲余说 defer 概述 Go 提供关键字defer 处理延迟调用问题。在语…

超详细BootLoader原理分析

【摘要】本文详细地介绍了基于嵌入式系统中的 OS 启动加载程序 ―― BootLoader 的概念、软件设计的主要任务以及结构框架等内容。 在拿到空PCB板之后&#xff0c;硬件工程师首先会测试各主要线路是否通连&#xff08;各焊点是否有空焊、断接或短路的情况&#xff09;&#xff…

黑群辉+腾讯云+frp内网穿透

说明 家里用了移动宽带&#xff08;套餐便宜&#xff09;&#xff0c;结果没有了公网IP&#xff0c;只能想别的办法。 现在网上的方法大概三种 1. 第三方服务器代理&#xff1b; 要花钱&#xff0c;放弃! 2. frp穿透&#xff1b; 需要需要一台有公网IP的云服务器&#xff0…

线代——基础解系 vs 特征向量

基础解系 基础解系的概念是针对方程而言的&#xff1b;齐次线性方程组的解集的最大无关组称为齐次线性方程的基础解系&#xff1b;要求齐次线性方程组的通解&#xff0c;只需求出它的基础解系。 【例】 特征向量 特征向量和特征值满足关系式 AαλαA\alpha \lambda \alpha…

超融合兼顾医疗信创及 IT 云化转型的可行性分析

近期&#xff0c;中央出台财政贴息专项再贷款等“组合拳”政策&#xff0c;重点支持医疗、教育等关键行业的设备更新改造&#xff0c;同时央行将优先审核和支持对国产自主品牌的采购。这一系列动作表明&#xff0c;医疗行业的国产化替代&#xff08;即信息技术应用创新&#xf…

计算机组成原理习题课第一章-2(唐朔飞)

计算机组成原理习题课第一章-2&#xff08;唐朔飞&#xff09; ✨欢迎关注&#x1f5b1;点赞&#x1f380;收藏⭐留言✒ &#x1f52e;本文由京与旧铺原创&#xff0c;csdn首发&#xff01; &#x1f618;系列专栏&#xff1a;java学习 &#x1f4bb;首发时间&#xff1a;&…

DHCP option 43是什么

背景 当AP和AC在同一个网段时&#xff0c;AP会主动发送广播报文&#xff0c;就能直接找到网段内的AC。当AP和AC在不同网段时&#xff0c;广播报文无法跨网段传播&#xff0c;只能在AP上指定AC IP地址&#xff0c;AP才能找到AC进行上线。 如果AP数量只有几个&#xff0c;可以采…

html里面的伪元素是什么?如何操作?

前言 在html中&#xff0c;有些小标签不想用具体的标签去写&#xff0c;就会用到伪元素&#xff0c;那么伪元素是什么呢&#xff0c;该如何使用呢&#xff1f; 一、伪元素是什么&#xff1f; 伪元素相当于在一个盒子内部产生一个行内盒子 二、使用步骤 1.创建一个盒子 <!…

学习架设传奇入门必读的好文章

很高兴今天能有时间给大家来说说一些事情&#xff0c;相信不少传奇爱好者都想自己开一个单机传奇&#xff0c;但是总认为自己思维没别人好&#xff0c;总感觉传奇技术这些是天赋的&#xff01;站长现在可以告诉大家&#xff0c;人的成功与天赋无关&#xff0c;但和努力是很相连…

Redis第一篇之基础入门,可以快速上手进行一些基础的操作

Redis基础入门篇,我是在linux系统下进行操作的1. NoSQL数据库简介1.1 概述1.2 NoSQL的适应性场景:1.3 NoSQL不适应的场景:1.4 Memcache1.5 Redis1.6 MongoDB2. Redis的性能和基础知识2.1 测试性能2.2 Redis的基础知识2.2.1 Redis默认有16个数据库2.2.2 设置键值2.2.3 Redis是单…