You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SKiasharp加载TTF文件设置Typeface后值仍为null的问题

问题分析与解决方案

核心问题

你的代码中SelectedtText属性使用了表达式体定义(=>),每次访问这个属性时都会创建一个全新的SKPaint实例。这意味着你在using块中给SelectedText.Typeface赋值的是一个临时实例,之后再访问SelectedText时,拿到的是未设置字体的新实例,看起来就像Typeface始终为null。

修复步骤

  1. 修改SelectedText的定义方式,确保它只创建一次实例:

    // 改为静态只读字段,初始化一次后不再创建新实例
    public static readonly SKPaint SelectedText = new SKPaint 
    { 
        Color = SKColors.Black, 
        FakeBoldText = true, 
        Style = SKPaintStyle.Stroke, 
        StrokeWidth = .6f 
    };
    

    若需要延迟初始化:

    private static SKPaint _selectedText;
    public static SKPaint SelectedText 
    {
        get 
        {
            if (_selectedText == null)
            {
                _selectedText = new SKPaint 
                { 
                    Color = SKColors.Black, 
                    FakeBoldText = true, 
                    Style = SKPaintStyle.Stroke, 
                    StrokeWidth = .6f 
                };
            }
            return _selectedText;
        }
    }
    
  2. 确认资源配置正确:

    • 确保TTF文件在项目中的生成操作设置为「嵌入的资源」
    • 核对资源名称是否准确,可通过以下代码输出所有嵌入资源名称验证:
      var resourceNames = Assembly.GetExecutingAssembly().GetManifestResourceNames();
      foreach (var name in resourceNames)
      {
          Console.WriteLine(name);
      }
      

修改后的完整代码示例

public static readonly SKPaint SelectedText = new SKPaint 
{ 
    Color = SKColors.Black, 
    FakeBoldText = true, 
    Style = SKPaintStyle.Stroke, 
    StrokeWidth = .6f 
};

// 加载字体并赋值
using (var resource = Assembly.GetExecutingAssembly().GetManifestResourceStream("MyMobileApp.Resources.Fonts.RobotoRegular.ttf"))
{
    if (resource != null)
    {
        var typeface = SKTypeface.FromStream(resource);
        SelectedText.Typeface = typeface;
    }
}

内容的提问来源于stack exchange,提问作者SRI

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 02:15:34