我的用户进行了大量的双向文本编辑,他们用一些Left-to-right和/或Right-to-left标记来填充文本的情况并不少见。有时他们想要查看这些标记在文本中的位置,以便移动或删除它们
Windows窗体中的TextBox
控件提供了一个默认的上下文菜单,其中包含一些与Unicode相关的条目,其中一个是Show Unicode control characters
启用此选项将强制控件绘制相应字体中为这些不可打印字符定义的字形。
例如,如果我将Text
控件的TextBox
属性设置为"Hello \u200E World!"
并启用此选项,我将获得LRM character rendered using its glyph as defined in the font file(使用的字体是Segoe UI )。
如果我们在字体编辑软件(我使用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控制字符而不诉诸各种黑客,例如将这些字符替换为转换器中的其他字符?