UWP - 如何覆盖 RichEditBox 的默认 Segoe UI 字体

问题描述

我们有一个带有 RichEditBox 的 UWP 应用,它从 RTF 接收内容,如下所示:

{\rtf1\ansi\ansicpg1252\cocoartf2512
\cocoatextscaling1\cocoaplatform1{\fonttbl\f0\fnil\fcharset0 HelveticaNeue;}
{\colortbl;\red255\green255\blue255;\red59\green52\blue26;}
{\*\expandedcolortbl;;\cssrgb\c23137\c20392\c10196;}
\pard\tx5600\tx6160\tx6720\fi200\slleading21\pardirnatural\partightenfactor0
\f0\fs20 \cf2 Healthy Eating Takes Neighborhood by Storm!}

如您所见,字体系列是 HelveticaNeue,它不是 Windows 10 机器中预装的字体,因此我们的 RichEditBox 回退到系统 Segoe UI。

我们使用以下代码设置 RichEditBox内容

string rtfContent = "{\rtf1 [...] by Storm!}"; // the actual content to fill the RichEditBox
RichEditBox myRichEditBox = ...;
myRichEditBox .Document.SetText(TextSetoptions.FormatRtf,rtfContent);

请注意,我们无法修改输入的 RTF。

我们还尝试了一个更简单的 PoC,我们在 XAML 中设置:

<RichEditBox x:Name="myRichEditBox1"  FontFamily="Algerian" Width="500" Height="300"/>

以及后面的代码

private void TestRtfFonts()
{
    string rtf = "{\\rtf1\\fbidis\\ansi\\ansicpg1252\\deff0\\nouicompat\\deflang2057{\\fonttbl{\\f0\\fswiss\\fprq2\\fcharset0 Helvetica Neue;}}{\\colortbl ;\\red0\\green0\\blue0;}{\\*\\generator Riched20 10.0.18362}\\viewkind4\\uc1\\pard\\Nowidctlpar\\tx720\\cf1\\f0\\fs21 I would like to see this text in Algerian}";
    myRichEditBox1.Loaded += (sender,args) =>
    {
        myRichEditBox1.Document.SetText(TextSetoptions.FormatRtf,rtf);
    };
}

这个测试的图形结果是这样的:

enter image description here

这显然表明 RichEditBox 工作不正常...

有没有办法告诉 UWP 使用另一种字体(例如 Verdana)而不是 Segoe UI,或者更好的是我作为应用资源嵌入到应用中的自定义字体?

非常感谢!

解决方法

您可以像 richEditBox.FontFamily = new FontFamily("Consolas") 一样直接设置 FontFamily 属性。

对于自定义字体,您可以将其下载并添加到项目的 Assets 文件夹中(右键单击Assets->添加->Existing Item ->您的字体文件)。
这个字体文件的属性应该是:

  • 构建操作 - 内容
  • 复制到输出目录 - 如果更新则复制

用法:

<RichEditBox FontFamily= "Assets/customfont.ttf#font name"/>  

我的样本:

<RichEditBox x:Name="myRichEditBox1"  FontFamily="Assets/Helvetica-Neue-2.ttf#Helvetica Neue" />

更新:

我可以重现您的问题。加载文本后只需设置fontfamily,如下所示。

myRichEditBox1.Loaded += (sender,args) =>
    {
        myRichEditBox1.Document.SetText(TextSetOptions.FormatRtf,rtf);
myRichEditBox1.FontFamily = new FontFamily("Algerian");
//myRichEditBox1.FontFamily = new FontFamily("Assets/Helvetica-Neue-2.ttf#Helvetica Neue");
    };

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...