使用Avalonia跨Linux平台

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博客

  • 2
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Avalonia Print是一种用于在Avalonia图形界面框架中进行打印的功能。Avalonia是一个用于创建平台用户界面的开源项目,而Avalonia Print则是其提供的一个用于打印的工具。通过Avalonia Print,我们可以在Avalonia应用程序中实现打印功能,无论是打印文本、图像还是其他类型的内容都可以轻松实现。 Avalonia Print的使用相对简单,我们只需要在Avalonia应用程序中引入相关的命名空间和类,就可以使用其提供的打印方法和属性。我们可以通过调用Avalonia Print提供的Print方法来触发打印操作,而在打印过程中,可以使用Avalonia Print提供的一些属性来设置打印的参数,例如打印机名称、打印份数、页面方向以及页面大小等。 使用Avalonia Print进行打印时,我们可以先创建一个打印文档对象,然后在该文档对象中定义要打印的内容,包括页面布局、文本内容、图像等等。在定义完成后,我们可以将该打印文档对象传递给Avalonia Print的Print方法,以开始打印操作。 值得一提的是,Avalonia Print还提供了一些与打印相关的事件,如打印开始事件、打印完成事件等,我们可以通过订阅这些事件来获得打印的进度和结果。此外,Avalonia Print还支持在打印过程中自定义页面的外观,例如可以通过实现自定义的页面模板来实现自定义的打印布局。 总之,Avalonia Print是Avalonia框架中的一个方便易用的打印工具,通过它我们可以在Avalonia应用程序中实现打印功能,为用户提供更好的打印体验。无论是在开发商业应用程序、办公软件还是其他场景中,Avalonia Print都能为我们提供便捷高效的打印解决方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

故里2130

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值