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

UWP中通过URI为RichEditBox设置默认字符格式字体时抛出异常

解决RichEditBox设置DefaultCharacterFormat字体族抛出ArgumentException的问题

问题分析

在UWP的RichEditBox中,给文本范围的CharacterFormat设置带ms-appx:///路径的自定义字体可正常运行,但直接修改GetDefaultCharacterFormat()返回对象的Name属性时,会抛出System.ArgumentException: 'Value does not fall within the expected range.'异常。

核心原因有两点:

  1. GetDefaultCharacterFormat()返回的ITextCharacterFormat实例,修改其属性后不会自动同步到文档默认格式,必须显式调用SetDefaultCharacterFormat方法完成应用。
  2. 默认字符格式对带协议路径的字体引用兼容性有限,使用已注册到应用的字体家族名是更可靠的方式。

解决方案

方案1:注册自定义字体到应用(推荐)

先将自定义字体注册到应用的字体集合,之后直接使用字体家族名即可,无需路径引用。

  1. 添加字体文件到项目:将Aguafina Script.ttf添加到项目,在属性面板设置"生成操作"为"内容","复制到输出目录"为"如果较新则复制"。
  2. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 06:24:56