UWP中通过URI为RichEditBox设置默认字符格式字体时抛出异常
解决RichEditBox设置DefaultCharacterFormat字体族抛出ArgumentException的问题
问题分析
在UWP的RichEditBox中,给文本范围的CharacterFormat设置带ms-appx:///路径的自定义字体可正常运行,但直接修改GetDefaultCharacterFormat()返回对象的Name属性时,会抛出System.ArgumentException: 'Value does not fall within the expected range.'异常。
核心原因有两点:
GetDefaultCharacterFormat()返回的ITextCharacterFormat实例,修改其属性后不会自动同步到文档默认格式,必须显式调用SetDefaultCharacterFormat方法完成应用。- 默认字符格式对带协议路径的字体引用兼容性有限,使用已注册到应用的字体家族名是更可靠的方式。
解决方案
方案1:注册自定义字体到应用(推荐)
先将自定义字体注册到应用的字体集合,之后直接使用字体家族名即可,无需路径引用。
- 添加字体文件到项目:将
Aguafina Script.ttf添加到项目,在属性面板设置"生成操作"为"内容","复制到输出目录"为"如果较新则复制"。 - 在Package.appxmanifest中声明字体:添加以下扩展节点:
<Package ...> <Applications> <!-- 原有应用配置 --> </Applications> <Extensions> <Extension Category="windows.fonts"> <Fonts> <Font File="Aguafina Script.ttf" /> </Fonts> </Extension> </Extensions> </Package>
方案2:修正默认格式的设置流程
如果不想注册字体,可通过先修改格式对象再显式应用的方式设置,但仍建议优先使用注册字体的方式避免兼容性问题。
修正后的代码:
public MainPage() { this.InitializeComponent(); RichEditBox rbox = new RichEditBox(); Canva.Children.Add(rbox); rbox.Document.SetText(0, "asdfasfasdfasdfasdfoiuytredfxbnuytrxgd "); // 文本范围设置字体(原代码正常部分) rbox.Document.GetRange(0,10).CharacterFormat.Name = "ms-appx:///Aguafina Script.ttf#Aguafina Script"; // 修正默认格式设置 var defaultCharFormat = rbox.Document.GetDefaultCharacterFormat(); // 已注册字体直接用家族名;未注册可尝试路径(不推荐) defaultCharFormat.Name = "Aguafina Script"; // 显式应用修改后的默认格式 rbox.Document.SetDefaultCharacterFormat(defaultCharFormat); }
补充说明
- 注册字体后,该字体可在所有XAML控件(如TextBlock、TextBox)中直接引用,无需重复配置路径。
- 禁止直接修改
GetDefaultCharacterFormat()返回对象却不调用SetDefaultCharacterFormat,这种操作既不会生效,还可能触发异常。
内容的提问来源于stack exchange,提问作者pavan kumar
相关产品推荐
相关产品推荐

