SKiasharp加载TTF文件设置Typeface后值仍为null的问题
问题分析与解决方案
核心问题
你的代码中SelectedtText属性使用了表达式体定义(=>),每次访问这个属性时都会创建一个全新的SKPaint实例。这意味着你在using块中给SelectedText.Typeface赋值的是一个临时实例,之后再访问SelectedText时,拿到的是未设置字体的新实例,看起来就像Typeface始终为null。
修复步骤
修改
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; } }确认资源配置正确:
- 确保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
相关产品推荐
相关产品推荐

