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

19

我需要一种方法来呈现常规空格、不间断空格和其他格式化字符(如从左到右标记),就像MS Word在选择显示不可打印字符时所呈现的方式。

我尝试了两种方法:

1)将字符替换为很少使用的字符。这个方法可行,但在这种情况下,我们失去了“不间断”空格的非打断行为(而LTR和RTL标记也停止工作)。

2)使用自定义字体。

这可以保留不间断空格和LTR / RTL标记的特殊行为,但由于某种奇怪的原因,WPF使用普通空格符呈现不间断空格。

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

这个问题可以通过应用不同的字体,并为空格和不间断空格使用不同的空格符解决,但即使我为它们添加了字形,LTR和RTL标记仍然没有被呈现。

您有什么想法,我如何能够使用可见字形呈现这些字符并保留它们的“LTR”,“RTL”,“不间断”行为?


在需要保留行为的情况下,请使用追加而不是替换。在 Word 中,段落符号不会替换换行符。 - paparazzo
3个回答

1

直到现在我还没有尝试过类似的东西,但是我可以想到两种选择:

警告 -> 我没有尝试过

第一种方法:

  1. 创建一个UIElement的子类
  2. 使用ControlTemplate获取Richtextbox的样式,并将其添加到App.xaml中
  3. 在RichTextBox ControlTemplate的内部Panel中添加一个你的UIElement子类的实例
  4. 通过DataBinding在ControlTemplate中使RTBox对你的类的依赖属性可用(如果可能),或者使用任何其他可以完成工作的方式
  5. 在你的UIElement子类中,遍历文档中的字符
  6. 为每个空格和LineBreak绘制一个符号
  7. 使用RichTextBox获取特定位置字符的Rect。使用此rect放置符号。

这种方法的优点是你有一个干净的分离,不需要子类化RTFBox,但无法操纵间距的宽度以腾出更大的符号空间。此外,其他开发人员需要知道他们需要该样式才能获得该功能。

第二种方法:

  1. 创建自定义装饰器
  2. 使用自定义装饰器装饰RTBox
  3. 从装饰器中,您应该能够访问子RTBox
  4. 在您的UIElement子类中,您需要迭代文档的字符
  5. 遇到每个空格和LineBreak时,在您的UIElement中绘制一个符号
  6. 我记得RichTextBox有可能获取特定位置字符的Rect。使用这个Rect来放置符号。

而且不需要对RTBox进行子类化,也不能调整间距。与方法1相比,其他开发人员将立即认识到已添加此功能的区别是您还需要处理滚动。


0

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


0

将所有值存储为它们的特殊字符。听起来你的打印函数需要处理:a)用户想要的输出类型,b)解释数据数组/大量字符并根据用户想要查看的内容输出值。虽然你没有提供太多关于如何存储你的东西的细节,但这是一个非常合理的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接