首页 > 系统相关 >使用Avalonia跨Linux平台

使用Avalonia跨Linux平台

时间:2023-12-23 20:11:32浏览次数:27  
标签:typeface 平台 skTypeface FontFamily Linux using public Avalonia

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

标签:typeface,平台,skTypeface,FontFamily,Linux,using,public,Avalonia
From: https://www.cnblogs.com/chinasoft/p/17923556.html

相关文章

  • Linux操作系统之面试必刷50题
    1、static作用static是一个关键字,在不同的上下文中具有不同的作用。以下是static关键字的几种常见用法和作用:静态变量(StaticVariables):在函数内部使用static关键字声明的变量称为静态变量。静态变量在程序的整个生命周期内都存在,不会随着函数的调用而被销毁。静态变量的作用域......
  • linux内核中的zero-page
    zero-page操作系统给用户新分配的内容(通过mmap或者brk)都是清零过的,但是这些虚拟地址通常都是按需分配物理页面。这里的“按需”的需求可能是读取,也可能是写入。如果只是读取,只要保证读取内容是零即可,在MMU的基础上,可以让“所有”虚拟地址都映射到内容为0的物理页面中。这样如......
  • 深入了解 Linux 网卡和网口:揭秘网络接口的奥秘
    实际工作中,把服务器关机了,网线从一个网口移动到了其他网口,导致再开机后,服务器无法联网了。由于缺少王工的支持,这使我开始关注网络技术。先总结下常用的概念和操作吧。1.网卡和网口的对应关系在Linux系统中,网卡(NetworkInterfaceCard,NIC)与网络接口(网口)之间存在紧密的对应关系。......
  • 按马哥教育关于2023版Linux云计算SRE工程师掌握知识类别,你会了哪些?
    模块1:Linux新手快速基础入门模块2:面试必备-企业级Shell脚本编程实战模块3:Linux系统结构、内核、进程进阶模块4:网络管理管理及互联网通信实战模块5:互联网常见服务应用实战模块6:网络安全、加密及安全通信实战模块7:安全加固内核防火墙Iptables模块8:企业级Web-LA/NMP架......
  • 【Linux】命令实现分卷压缩
    压缩命令#压缩命令:把es-head.tar文件,差分成20m大小的文件,每一部分都以es-head-part-前缀命名split-b20mes-head.tares-head-part-#压缩命令:把testSplit文件夹,压缩拆分成20m大小的文件,每一部分都以testSplit-part-前缀命名tar-czvf-testSplit/|split-b20m-test......
  • Linux磁盘分区和挂载
    一、准备工作(1)查看主机磁盘命令:lsblk(2)查看主机磁盘挂载文件系统情况命令:df-h二、磁盘分区(1)分区命令:fdisk-b1024/dev/vda其中:b1024,一个sectorsize的大小;1GB;使用-b指定sector时,每个sector的大小是:sectorsize(512,1024,2048or4096)。(2)根据提示填写相应信息n,是......
  • Linux:vscode扩展无法下载,报错:Error while fetching extensions : XHR failed
     在Linux系统上下载安装好vscode以后,发现扩展里面无法下载安装,报错:Error while fetching extensions : XHR failed 解决办法:修改hosts文件1.sudocp/etc/hosts/etc/hosts.bak2.sudovi/etc/hots3.在文件末尾增加下面的文字,然后保存,关闭  4.刷新DNS,Ubuntu22......
  • linux命令find使用技巧汇总
    linux命令find是一个强大的工具,它可以在指定的目录下查找文件和目录,还可以根据不同的条件进行过滤和限制,甚至可以对查找到的文件执行操作。......
  • 【Linux】正则匹配SQL里面的时间 TIMESTAMP
    在使用plsql或者dbeaver的insertsql导出的时候通常日期格式的会导出为以下形式,我们通常将这些日期需要更新为sysdate或者to_char(sysdate,'YYYYMMDD')的形式,此时可以使用正则匹配来替换,以下列举了常见的两种时间场景:1.匹配TIMESTAMP'2023-12-2318:00:01:000000'通常创建时......
  • Linux Shell: 写程序 翻译单词
    脚本#!/usr/bin/python3......