如何在WPF RichTextBox中将空格渲染为点?

时间:2012-06-14 04:39:17

标签: wpf fonts whitespace

当你选择显示不可打印的字符时,我需要渲染常规空间,不间断空格和一些其他格式化字符(如从左到右标记)的方式,如MS Word渲染它们。

我尝试了两种方法:

1)用很少使用的字符替换字符。 它有效,但在这种情况下,我们松开了不可破坏空间的“不间断”行为(并且LTR和RTL标记也停止工作)

2)使用自定义字体

它允许保留不间断空格和LTR / RTL标记的特殊行为,但由于某些奇怪的原因,WPF使用通常的空格字形呈现不间断空格。

WinForms RichTextBox正确呈现相同字体的文本。

这个问题可以通过为空格和不间断空格应用具有不同空格字形的不同字体来解决,但即使我为它们添加字形,也不会渲染LTR和RTL标记。

您是否有任何想法如何使用可见的字形呈现字符,保留其“LTR”,“RTL”,“不间断”行为?

3 个答案:

答案 0 :(得分:1)

直到现在我才尝试过类似的东西,但我可以想到两个选择:

警告 - >我没试过

第一种方法:

  1. 创建UIElement的子类
  2. 使用ControlTemplate获取Richtextbox的样式并将其添加到App.xaml
  3. 从RichTextBox ControlTemplate
  4. 在Scrollviewer的内部面板中添加子类UIElement的实例
  5. 通过ControlTemplate中的DataBinding(如果可能)或任何其他完成工作的方式,使RTBox可用于类中的依赖项属性
  6. 在您的UIElement子类中,您遍历文档的字符
  7. 在Adorner中为每个空间和遇到的LineBreak绘制符号
  8. 使用RichTextBox获取特定位置的角色的Rect。使用此矩形放置符号。
  9. 此方法的优点是您具有干净的分离并且不需要子类化RTFBox,但是您将无法操纵间距的宽度以为较大的符号腾出空间。此外,其他开发人员需要知道他们需要该样式才能获得该功能。

    第二种方法:

    1. 制作自定义广告
    2. 使用自定义Adorner
    3. 装饰RTBox
    4. 从Adorner,您应该可以访问Child RTBox
    5. 在您的UIElement子类中,您遍历文档的字符
    6. 在UIElement中为每个空格和遇到的LineBreak画一个符号
    7. 我记得有可能使用RichTextBox将角色的Rect放在特定位置。使用此矩形放置符号。
    8. 它也没有子类化RTBox。你也无法调整间距。与方法1相反,其他开发人员将立即认识到已添加此功能。一个缺点是你也必须处理滚动。

答案 1 :(得分:0)

您可以尝试在LTR / RTL可见字形附近插入而不是替换它。

答案 2 :(得分:0)

将所有值存储为特殊字符。听起来你的打印功能需要处理a)用户想要什么样的输出,b)解释你的数据数组/大量字符串,并根据用户想要看到的内容吐出值。你没有提供太多关于你的东西存储的详细信息,但这是一种非常合理的方式。