Windows-universal-samples 之 XamlCloudFontIntegration:XAML 集成 DirectWrite 可下载字体的实践指南 示例工程【免费下载链接】Windows-universal-samplesAPI samples for the Universal Windows Platform.项目地址https://gitcode.com/gh_mirrors/wi/Windows-universal-samples点击查看免费下载导读本文围绕 Samples/XamlCloudFontIntegration 示例深入讲解 Windows 10 引入的 DirectWrite 可下载字体Downloadable Fonts机制如何在 XAML 应用中开箱即用开发者无需任何特殊 API 或标记仅需像平时一样为文本元素设置 Windows 字体系统便会在字体缺失时自动从微软服务下载并按需缓存。读完本文你将掌握该机制的运行原理、三个文档场景的源码实现、缓存清理脚本的用法以及构建与运行该示例的完整步骤。示例概览一个展示云端字体的 UWP 应用该示例的核心价值在于演示可下载字体机制已被直接集成进 XAML这一事实。正如 README.md 所述应用只需使用 Windows 字体格式化 XAML 文本元素即可自动获得字体下载能力无需任何特殊 API 或标记。从仓库结构看示例提供 C#cs/与 C/CXcpp/两套实现每套均包含 5 个场景页面。在 C# 侧场景列表由 SampleConfiguration.cs 注册public const string FEATURE_NAME XAML Integration of DirectWrite Downloadable Fonts; ListScenario scenarios new ListScenario { new Scenario() { TitleUsing this sample app, ClassTypetypeof(Scenario_SampleOverview)}, new Scenario() { TitleDownloadable fonts overview, ClassTypetypeof(Scenario_CloudFontOverview)}, new Scenario() { TitleDocument 1, ClassTypetypeof(Scenario_Document1)}, new Scenario() { TitleDocument 2, ClassTypetypeof(Scenario_Document2)}, new Scenario() { TitleDocument 3, ClassTypetypeof(Scenario_Document3)} };5 个场景分工明确前两个提供使用引导与机制说明后三个分别用不同字体模拟加载三份文档用于实际体验按需下载行为。可下载字体机制的核心原理机制来源XAML 之下的 DirectWriteDirectWrite 是 DirectX 图形平台的一部分XAML 依赖它完成文本与图形的显示。Windows 10 为 DirectWrite 增加了新能力允许应用使用设备上未安装的字体格式化文本内容并在文本显示时自动从微软服务下载该字体。这一能力直接集成在 XAML 层XAML 开发者无需编写任何特殊代码。运行时行为回退字体 → 自动刷新Scenario_CloudFontOverview.xaml 对机制行为给出了权威描述可归纳为以下几点先回退、后刷新内容加载时XAML 先用回退字体fallback fonts显示文本短暂延迟后XAML 自动刷新视图改用请求的字体显示内容。系统级缓存字体数据会被本地缓存且缓存跨应用共享——即使某个应用首次使用某字体它可能早已存在于缓存中从而跳过回退阶段。若字体长时间未使用缓存可能被清除下次使用时会再次触发下载。大字体按需分段下载某些字体体积很大尤其是中文、日文、韩文字体DirectWrite 只下载足以显示当前内容的字体片段当后续内容包含之前未出现的字符时再补充下载其余片段。网络依赖与流量提示无网络连接时内容将以回退字体或先前已下载的片段显示在按流量计费metered连接上使用该机制会产生数据流量因此静态 UI 应只使用在所有 Windows 10 设备上保证本地可用的推荐字体。三个文档场景源码级剖析三个文档场景的文件分别为Scenario_Document1.*、Scenario_Document2.*、Scenario_Document3.*。它们结构一致差别仅在于所选字体与正文语言用于展示不同脚本/字体组合的下载行为。字体通过代码在运行时设置一个关键设计是字体格式化在页面加载时以编程方式应用而非直接写在 XAML 标记中。这样做的原因源码注释中已明确说明是如果字体写在 XAML 里仅凭 Visual Studio 的 XAML 设计器查看文件就会触发字体数据下载从而破坏运行时体验下载行为的演示目的。参见 Scenario_Document1.xaml 中的注释In order to better simulate runtime behavior in this sample, font formatting will be set in code when the page is loaded. Otherwise, if it were set here, the font data would have already been downloaded just by viewing this file in Visual Studio with the Xaml designer.C# 实现设置 Page.FontFamily三个场景的 C# 实现极其简洁均在Page_Loaded事件中为整个页面设置FontFamily格式化会作用于页面上所有未显式设置FontFamily的内容元素// Scenario_Document1.xaml.csNeue Haas Grotesk Text Pro拉丁文本Lorem ipsum this.FontFamily new Windows.UI.Xaml.Media.FontFamily(Neue Haas Grotesk Text Pro); // Scenario_Document2.xaml.csFangSong仿宋 this.FontFamily new Windows.UI.Xaml.Media.FontFamily(FangSong); // Scenario_Document3.xaml.csKokila this.FontFamily new Windows.UI.Xaml.Media.FontFamily(Kokila);对应文件Scenario_Document1.xaml.cs、Scenario_Document2.xaml.cs、Scenario_Document3.xaml.cs。C/CX 实现同样的思路不同的语法C/CX 版本在Page_Loaded中通过ref new创建FontFamily对象逻辑完全一致// Scenario_Document1.xaml.cppNeue Haas Grotesk Text Pro this-FontFamily ref new Windows::UI::Xaml::Media::FontFamily(Neue Haas Grotesk Text Pro); // Scenario_Document2.xaml.cppFangSong this-FontFamily ref new Windows::UI::Xaml::Media::FontFamily(FangSong);对应文件Scenario_Document1.xaml.cpp、Scenario_Document2.xaml.cppScenario_Document3的 C 版本与之同理。页面 XAML 布局每个文档页的 XAML 布局相似见 Scenario_Document1.xaml通过Grid.Resources中的隐式Style统一设置TextBlock的TextWrappingWrap、Margin与FontSize20正文放在带滚动能力的ScrollViewer中便于容纳大段文本。页面在LoadedPage_Loaded时触发字体设置。三个文档的对照关系如下场景文件字体FontFamily正文内容设计意图Scenario_Document1.*Neue Haas Grotesk Text ProLorem ipsum拉丁文演示拉丁字体按需下载Scenario_Document2.*FangSong仿宋中文字符内容演示中文字体按需下载Scenario_Document3.*Kokila相应语言内容演示其他字体按需下载重置机制ClearDownloadableFontCache.ps1为什么要重置缓存一旦某个文档被显示其字体便会缓存在设备本地。若要反复体验字体未缓存时首次加载的场景必须先清空缓存。示例的 Scenario_SampleOverview.xaml 给出了完整操作步骤。该脚本虽不属于示例项目本身却是演示与调试该机制的重要工具。脚本实现解析cpp/ClearDownloadableFontCache.ps1 与 cs/ClearDownloadableFontCache.ps1 内容一致其核心逻辑如下# 1. 校验管理员权限 $Identity [Security.Principal.WindowsIdentity]::GetCurrent() $Principal [Security.Principal.WindowsPrincipal]$Identity if (!$Principal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) { Write-Warning You must run this script as administrator. Exit } # 2. 停止 FontCache 服务 → 删除缓存目录中的 .bin 文件 → 重启服务 $FontCachePath $env:WinDir\ServiceProfiles\LocalService\AppData\Local\FontCache\Fonts if (Test-Path $FontCachePath) { Get-Service FontCache | Stop-Service Get-ChildItem -Path $FontCachePath -Filter *.bin | Remove-Item Get-Service FontCache | Start-Service }要点说明必须以管理员身份运行脚本首先通过WindowsPrincipal.IsInRole检查当前进程是否具有管理员权限否则输出警告并退出。操作的是系统 FontCache 服务字体缓存位于%WinDir%\ServiceProfiles\LocalService\AppData\Local\FontCache\Fonts脚本先停止FontCache服务、删除目录下所有.bin缓存文件、再重启服务从而完全重置下载字体状态。适用于 Windows 桌面系统示例文档明确说明此重置流程在 Windows 桌面系统上可行。推荐命令行用法在管理员权限的cmd.exe或 PowerShell中先切换到示例项目所在目录再执行powershell -ExecutionPolicy Bypass -File ClearDownloadableFontCache.ps1完整重置流程为①关闭示例应用 → ②以管理员身份打开控制台窗口并切换到示例项目目录 → ③运行上述脚本 → ④重新启动示例应用。该流程同样适用于调试你自己的应用。观察机制运行任务管理器中的网络活动Scenario_SampleOverview.xaml 还给出一个观察平台行为的实用技巧在应用运行期间打开任务管理器并切换到性能Performance选项卡观察网络活动每打开一个文档都应能看到一次短暂的网络活动尖峰那正是字体被下载的时刻。需要注意的是在桌面系统上示例用到的部分字体可能本机已经安装。这种情况下 XAML 会直接使用本地字体立即显示文档无需任何下载——这也从侧面印证了按需下载的前提是字体在本地不可用。构建与运行示例系统要求目标平台要求ClientWindows 10ServerWindows Server 2016 Technical PreviewPhoneWindows 10构建步骤若下载的是样例 ZIP 包务必解压整个归档而不仅是包含目标示例的文件夹——解压完整才能访问共享依赖本仓库中即SharedContent目录。启动 Visual Studio选择文件打开项目/解决方案。从解压目录进入Samples子文件夹再进入本示例文件夹XamlCloudFontIntegration选择首选语言子目录C 或 C#双击解决方案文件.sln。C# 侧为 CloudFontIntegration.slnC 侧为 CloudFontIntegration.sln。按CtrlShiftB或选择生成生成解决方案。运行步骤运行方式取决于仅部署还是部署并运行仅部署选择生成部署解决方案。部署并运行按F5或选择调试开始调试进行调试运行按CtrlF5或选择调试开始执行不调试则不调试直接运行。总结与延伸阅读XamlCloudFontIntegration 示例用最少的代码量展示了 Windows 10 一项颇具实用价值的能力XAML 开发者零成本获得按需字体下载。其核心要点可总结为零 API 接入只需设置FontFamily无需任何特殊 API 或标记。自动回退与刷新字体缺失时先以回退字体显示随后自动刷新为请求字体。系统级缓存字体数据跨应用共享缓存重复使用可跳过下载长时间不用则可能被清除。按需分段下载中日韩等大字体仅下载所需片段字符扩充时增量补充。重置工具ClearDownloadableFontCache.ps1可在管理员权限下清空字体缓存用于反复演示与调试。若想进一步了解 UWP 中的字体与排版设计规范可参考仓库中其他相关示例本示例本身还可在任务管理器网络活动面板中观察下载过程作为验证机制运行的有效手段。赞分享示例工程【免费下载链接】Windows-universal-samplesAPI samples for the Universal Windows Platform.项目地址https://gitcode.com/gh_mirrors/wi/Windows-universal-samples点击查看免费下载相关推荐Windows-universal-samples 之 AdaptiveStreamingUWP 自适应流媒体AdaptiveMediaSource全场景实战指南Windows universal samples 之 AdaptiveStreamingUWP 自适应流媒体AdaptiveMediaSource全场景示例工程解析 KubeSphere 依赖库 gojsonpointerRFC 6901 JSON Pointer 的 Go 实现解析 KubeSphere 依赖库 gojsonpointerRFC 6901 JSON Pointer 的 Go 实现 本文以 KubeSphere 仓库示例工程Easy-Query实体代理机制解析如何实现零反射高性能Easy Query实体代理机制解析如何实现零反射高性能 在Java ORM框架中反射机制虽然简化了开发但往往成为性能瓶颈。Easy Query作为一款轻示例工程上一篇Vim.js 开源项目使用教程在浏览器中体验经典Vim编辑器下一篇5分钟完成黑苹果EFI配置OpCore-Simplify智能自动化工具完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考