问题描述
我们有一个带有 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。
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);
};
}
这显然表明 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");
};