唐朝豪放男 發表於 2021-1-29 20:33:00

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>&lt;ItemGroup&gt;
    &lt;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> /&gt;
    &lt;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> /&gt;
    &lt;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> /&gt;
&lt;/ItemGroup&gt;</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&lt;<span style="color: rgba(0, 0, 255, 1)">string</span>&gt; 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 =&gt;<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)">&lt;summary&gt;</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)">&lt;/summary&gt;</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>&lt;IFontManagerImpl&gt;().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>&nbsp;</p>
<p>经过以上三个步骤,我的程序可以在windows、Ubuntu、银河麒麟操作系统上正常运行,没有出错。</p><br><br>
来源:https://www.cnblogs.com/joyandjoys/p/14346935.html
頁: [1]
查看完整版本: avalonia项目在银河麒麟操作系统arm架构上运行报错:default font family is not be null or empty