19

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

我尝试了两种方法:

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

2)使用自定义字体

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

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

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

你有什么想法我可以用可见的字形渲染这些字符,保留它们的“LTR”、“RTL”、“不间断”行为吗?

4

3 回答 3

1

直到现在我还没有尝试过类似的事情,但我可以想到两个选择:

警告 -> 我没试过

第一种方法:

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

这种方法的优点是您有一个清晰的分隔并且不需要子类化 RTFBox,但是您将无法操纵间距的宽度来为更大的符号腾出空间。此外,其他开发人员需要知道他们需要该样式才能获得该功能。

第二种方法:

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

它也没有继承 RTBox。您也无法调整间距。与方法 1 相比,其他开发人员会立即意识到已添加此功能。一个缺点是您也必须处理滚动。

于 2013-01-22T17:18:22.840 回答
0

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

于 2012-10-17T16:48:48.587 回答
0

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

于 2012-10-11T07:56:13.023 回答