我的用户进行了大量的双向文本编辑,他们在文本中添加一些从左到右和/或从右到左的标记并不少见。有时他们想查看这些标记在文本中的位置以便移动或删除它们。
Windows 窗体中的TextBox
控件提供了一个默认上下文菜单,其中包含一些与 Unicode 相关的条目,其中之一是Show Unicode control characters
启用此选项将强制控件为那些不可打印的字符绘制以相应字体定义的字形。
例如,如果我将控件的Text
属性设置为并启用此选项,我将使用字体文件中定义的字形呈现 LRM 字符(使用的字体是 Segoe UI)。 TextBox
"Hello \u200E World!"
如果我们在字体编辑软件(我使用 FontForge)中打开 Segoe UI 字体,我们可以看到确实为LRM和RLM代码点定义了字形。
我还发现StringFormatFlags枚举可用于控制这些字符在 GDI+ 中的呈现方式,特别是通过向对象提供DisplayFormatControl
标志StringFormat
:
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);
}
但是,我在 WPF TextBox 或 RichTextBox 控件中没有发现任何类似的东西:默认上下文菜单仅提供复制、剪切和粘贴命令,并且所有控件属性(包括附加属性)似乎都无法使用其字体绘制控制字符- 定义的字形。
有没有一种方法可以在 WPF TextBox 或 RichTextBox 中使用其代表字形绘制 Unicode 控制字符,而无需求助于各种技巧,例如用转换器中的其他字符替换这些字符?