如何在 WPF 文本框中显示 Unicode 控制字符?

Mik*_*ail 5 c# unicode wpf fonts non-printing-characters

我的用户进行了大量的双向文本编辑,他们在文本中撒上一些从左到右和/或从右到左的标记并不罕见。有时他们想查看这些标记在文本中的位置,以便移动或删除它们。
Windows 窗体中的控件TextBox提供了一个默认上下文菜单,其中包含一些与 Unicode 相关的条目,其中之一是“显示 Unicode 控制字符”

启用此选项将强制控件为那些不可打印的字符绘制在相应字体中定义的字形。

例如,如果我将控件Text的属性设置TextBox"Hello \u200E World!"并启用此选项,我将使用字体文件中定义的字形呈现 LRM 字符(使用的字体是 Segoe UI)。

如果我们在字体编辑软件(我使用 FontForge)中打开 Segoe UI 字体,我们可以看到确实有为 LRMRLM代码点定义的字形。

我还发现StringFormatFlags枚举可用于控制这些字符在 GDI+ 中的呈现方式,特别是通过DisplayFormatControlStringFormat对象提供标志:

private void Form_Paint(object sender, PaintEventArgs e)
{
    var text = "Hello \u200E World!";
    var g = e.Graphics;

    // Will draw LRM symbol with its representative glyph
    var fmt = new StringFormat(StringFormatFlags.DisplayFormatControl);
    g.DrawString(text, Font, Brushes.Black, 10, 10, fmt);
}
Run Code Online (Sandbox Code Playgroud)

但是,我在 WPF TextBox 或 RichTextBox 控件中没有找到任何类似的内容:默认上下文菜单仅提供复制、剪切和粘贴命令,并且所有控件属性(包括附加属性)似乎都无法使用其字体绘制控制字符-定义的字形。

有没有一种方法可以在 WPF TextBox 或 RichTextBox 中绘制 Unicode 控制字符及其代表性字形,而无需诉诸各种技巧,例如在转换器中用其他字符替换这些字符?