avalonia项目在银河麒麟操作系统arm架构上运行报错:default font family is not be null or empty
<p>最近在做c#跨平台项目的时候,遇到了avalonia项目在银河麒麟操作系统上运行时报错:default font family is not be null or empty。但是在windows、ubuntu上运行没有问题。最终通过查看avalonia源码和官方提供的测试示例找到解决方案。(记录一下,避免以后忘了。。。)</p><p>第一步:将字体最为项目的嵌入资源导入进项目。</p>
<p><img src="https://img2020.cnblogs.com/blog/1346153/202101/1346153-20210129202641300-1336503896.png"></p>
<div class="cnblogs_code">
<pre><ItemGroup>
<EmbeddedResource Include=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Assets\Fonts\msyh.ttc</span><span style="color: rgba(128, 0, 0, 1)">"</span> />
<EmbeddedResource Include=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Assets\Fonts\msyhbd.ttc</span><span style="color: rgba(128, 0, 0, 1)">"</span> />
<EmbeddedResource Include=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Assets\Fonts\msyhl.ttc</span><span style="color: rgba(128, 0, 0, 1)">"</span> />
</ItemGroup></pre>
</div>
<p>第二步:新建一个类,作为自定义字体管理类。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> CustomFontManagerImpl : IFontManagerImpl
{
</span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">readonly</span><span style="color: rgba(0, 0, 0, 1)"> Typeface[] _customTypefaces;
</span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">readonly</span> <span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)"> _defaultFamilyName;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">Load font resources in the project, you can load multiple font resources</span>
<span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">readonly</span> Typeface _defaultTypeface =
<span style="color: rgba(0, 0, 255, 1)">new</span> Typeface(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">resm:AvaloniaApplication1.Assets.Fonts.msyh#微软雅黑</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> CustomFontManagerImpl()
{
_customTypefaces </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)">[] { _defaultTypeface };
_defaultFamilyName </span>=<span style="color: rgba(0, 0, 0, 1)"> _defaultTypeface.FontFamily.FamilyNames.PrimaryFamilyName;
}
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)"> GetDefaultFontFamilyName()
{
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> _defaultFamilyName;
}
</span><span style="color: rgba(0, 0, 255, 1)">public</span> IEnumerable<<span style="color: rgba(0, 0, 255, 1)">string</span>> GetInstalledFontFamilyNames(<span style="color: rgba(0, 0, 255, 1)">bool</span> checkForUpdates = <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">)
{
</span><span style="color: rgba(0, 0, 255, 1)">return</span> _customTypefaces.Select(x =><span style="color: rgba(0, 0, 0, 1)"> x.FontFamily.Name);
}
</span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">readonly</span> <span style="color: rgba(0, 0, 255, 1)">string</span>[] _bcp47 =<span style="color: rgba(0, 0, 0, 1)"> { CultureInfo.CurrentCulture.ThreeLetterISOLanguageName, CultureInfo.CurrentCulture.TwoLetterISOLanguageName };
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">bool</span> TryMatchCharacter(<span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> codepoint, FontStyle fontStyle, FontWeight fontWeight, FontFamily fontFamily,
CultureInfo culture, </span><span style="color: rgba(0, 0, 255, 1)">out</span><span style="color: rgba(0, 0, 0, 1)"> Typeface typeface)
{
</span><span style="color: rgba(0, 0, 255, 1)">foreach</span> (<span style="color: rgba(0, 0, 255, 1)">var</span> customTypeface <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> _customTypefaces)
{
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (customTypeface.GlyphTypeface.GetGlyph((<span style="color: rgba(0, 0, 255, 1)">uint</span>)codepoint) == <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
{
</span><span style="color: rgba(0, 0, 255, 1)">continue</span><span style="color: rgba(0, 0, 0, 1)">;
}
typeface </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Typeface(customTypeface.FontFamily.Name, fontStyle, fontWeight);
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
}
</span><span style="color: rgba(0, 0, 255, 1)">var</span> fallback = SKFontManager.Default.MatchCharacter(fontFamily?<span style="color: rgba(0, 0, 0, 1)">.Name, (SKFontStyleWeight)fontWeight,
SKFontStyleWidth.Normal, (SKFontStyleSlant)fontStyle, _bcp47, codepoint);
typeface </span>= <span style="color: rgba(0, 0, 255, 1)">new</span> Typeface(fallback?.FamilyName ??<span style="color: rgba(0, 0, 0, 1)"> _defaultFamilyName, fontStyle, fontWeight);
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
}
</span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> IGlyphTypefaceImpl CreateGlyphTypeface(Typeface typeface)
{
SKTypeface skTypeface;
</span><span style="color: rgba(0, 0, 255, 1)">switch</span><span style="color: rgba(0, 0, 0, 1)"> (typeface.FontFamily.Name)
{
</span><span style="color: rgba(0, 0, 255, 1)">case</span><span style="color: rgba(0, 0, 0, 1)"> FontFamily.DefaultFontFamilyName:
</span><span style="color: rgba(0, 0, 255, 1)">case</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">微软雅黑</span><span style="color: rgba(128, 0, 0, 1)">"</span>:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">font family name</span>
skTypeface = SKTypeface.FromFamilyName(_defaultTypeface.FontFamily.Name); <span style="color: rgba(0, 0, 255, 1)">break</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)">:
skTypeface </span>=<span style="color: rgba(0, 0, 0, 1)"> SKTypeface.FromFamilyName(typeface.FontFamily.Name,
(SKFontStyleWeight)typeface.Weight, SKFontStyleWidth.Normal, (SKFontStyleSlant)typeface.Style);
</span><span style="color: rgba(0, 0, 255, 1)">break</span><span style="color: rgba(0, 0, 0, 1)">;
}
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> GlyphTypefaceImpl(skTypeface);
}
}</span></pre>
</div>
<p>第三步:在App.axaml.cs中重写RegisterServices()函数,将我们自定义的字体管理对象注册进去。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><summary></span>
<span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> override RegisterServices register custom service
</span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"></summary></span>
<span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">override</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> RegisterServices()
{
AvaloniaLocator.CurrentMutable.Bind</span><IFontManagerImpl>().ToConstant(<span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> CustomFontManagerImpl());
</span><span style="color: rgba(0, 0, 255, 1)">base</span><span style="color: rgba(0, 0, 0, 1)">.RegisterServices();
}</span></pre>
</div>
<p> </p>
<p>经过以上三个步骤,我的程序可以在windows、Ubuntu、银河麒麟操作系统上正常运行,没有出错。</p><br><br>
来源:https://www.cnblogs.com/joyandjoys/p/14346935.html
頁:
[1]