Avalonia在Linux中的字体问题的一种解决方案(自定义字体管理类)报错:Default font family name can‘t be null or empty【0.10.xx版本可用】

1.在项目中附带一个默认字体,如下图:

2.创建一个自定义字体管理类实现IFontManagerImpl接口:

public class CustomFontManagerImpl : IFontManagerImpl
    {
        #region 私有成员

        private readonly MyFont[] _fonts = new MyFont[] {
            new MyFont() {
                FontName = "Source Han Sans CN",
                Path = "avares://项目名/Assets/Fonts/SourceHanSansCN-Regular.ttf",
                Typeface = new Typeface(new FontFamily(new Uri("avares://项目名/Assets/Fonts/SourceHanSansCN-Regular.ttf"), "Source Han Sans CN")),
                FontWeight  = FontWeight.Normal
            },
            new MyFont() {
                FontName = "Source Han Sans CN",
                Path = "avares://项目名/Assets/Fonts/SourceHanSansCN-Bold.ttf",
                Typeface = new Typeface(new FontFamily(new Uri("avares://项目名/Assets/Fonts/SourceHanSansCN-Bold.ttf"), "Source Han Sans CN")),
                FontWeight = FontWeight.Bold
            }
        };

        #endregion

        #region 实现接口

        public IGlyphTypefaceImpl CreateGlyphTypeface(Typeface typeface)
        {
            var font = Array.Find(_fonts, _ => _.FontName == typeface.FontFamily?.Name);
            if (font == null)
                font = _fonts.FirstOrDefault(_ => _.FontWeight == typeface.Weight) ?? _fonts.FirstOrDefault();
            if (font.SKTypeface == null)
            {
                var assets = (IAssetLoader)AvaloniaLocator.Current.GetService(typeof(IAssetLoader));
                font.SKTypeface = SKTypeface.FromStream(assets.Open(new Uri(font?.Path)));
            }
            return new GlyphTypefaceImpl(font.SKTypeface);
        }

        public string GetDefaultFontFamilyName()
        {
            return _fonts.FirstOrDefault()?.FontName;
        }

        public IEnumerable<string> GetInstalledFontFamilyNames(bool checkForUpdates = false)
        {
            return _fonts.Select(_ => _.FontName);
        }

        public bool TryMatchCharacter(int codepoint, FontStyle fontStyle, FontWeight fontWeight, FontFamily fontFamily, CultureInfo culture, out Typeface typeface)
        {
            var font = Array.Find(_fonts, _ => _.Typeface.GlyphTypeface.GetGlyph((uint)codepoint) == 0);
            if (font == null)
                font = _fonts.FirstOrDefault();
            typeface = new Typeface(font.Typeface.FontFamily.Name, fontStyle, fontWeight);
            return true;
        }

        #endregion

        #region 私有类

        private class MyFont
        {
            internal string FontName { get; set; }

            internal string Path { get; set; }

            internal Typeface Typeface { get; set; }

            internal SKTypeface SKTypeface { get; set; }

            internal FontWeight FontWeight { get; set; }
        }

        #endregion
    }

3.重写App类的RegisterServices方法

public partial class App : PrismApplication
{
	public override void RegisterServices()
	{
		AvaloniaLocator.CurrentMutable.Bind<IFontManagerImpl>().ToConstant(new CustomFontManagerImpl());
		base.RegisterServices();
	}
}

4.如果需要支持其它类型的字体,如相同字体的粗体,就可以在 _fonts中补充相应的字体,如下图:

同时,在接口的实现方法CreateGlyphTypeface中进行相关处理即可

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值