UWP运行时下载字体后添加到Application.Current.Resources失效问题
解决运行时下载并应用字体的问题
核心问题:应用安装目录(
Windows.ApplicationModel.Package.Current.InstalledLocation)是只读的,运行时无法修改其中的文件,你执行的移动文件操作实际并未生效,因此系统无法识别该目录下新增的字体。手动添加到项目Assets目录是因为编译时文件被打包进安装包,属于合法的安装资源,所以能被识别。正确方案:直接将下载的字体保存在应用的可写目录(
ApplicationData.Current.LocalFolder),通过ms-appdata:///local/协议引用该字体文件,无需移动到Assets目录。
修改后的完整代码:
// 下载字体文件 HttpClient client = new HttpClient(); var response = await client.GetByteArrayAsync("https://webfonts.sample.com/archivoblackregular/font.ttf"); // 将字体保存到应用可写目录(LocalFolder) StorageFolder localFolder = ApplicationData.Current.LocalFolder; StorageFile fontFile = await localFolder.CreateFileAsync($"{fontFamily}.ttf", CreationCollisionOption.ReplaceExisting); await File.WriteAllBytesAsync(fontFile.Path, response); // 构造字体的ms-appdata协议路径,格式为 ms-appdata:///local/文件名#字体族名 string fontUri = $"ms-appdata:///local/{fontFile.Name}#{fontFamily}"; // 添加到应用资源 Application.Current.Resources[fontFamily] = new FontFamily(fontUri);
- 关键说明:
ms-appdata:///local/是UWP访问本地应用数据目录的标准协议,系统可以通过这个协议加载LocalFolder中的字体文件。- 构造FontFamily时,格式为
协议路径#字体族名,这里的字体族名需要和字体文件内部的名称一致(可通过Windows字体查看器打开字体文件确认实际族名)。
内容的提问来源于stack exchange,提问作者pavan kumar
相关产品推荐
相关产品推荐

