【问题标题】:Bulleted RTF list gets indented differently on first line项目符号 RTF 列表在第一行缩进不同
【发布时间】:2018-09-12 10:57:35
【问题描述】:

我正在使用 .NET 和 Windows.Forms 应用程序。

在一个 RTF 框中,我设置了(使用.Rtf =)这个 RTF 标记:

{\rtf1\ansi\ansicpg1252\deff0\nouicompat\deflang1033{\fonttbl{\f0\fnil\fcharset0 Microsoft Sans Serif;}}          
{\colortbl ;\red0\green0\blue255;\red255\green0\blue0;}
{\*\generator Riched20 10.0.14393}\viewkind4\uc1 
\pard\f0\fs17 
{\pntext\f0 'B7\tab}{\*\pn\pnlvlblt\pnf0\pnindent0{\pntxta\'B7}}\fi-180\li260\f0 The first line in bullet list.
\par{\pntext\f0\'B7\tab}Second line.
\par{\pntext\f0\'B7\tab}Third line.

可见的结果是这样的:

⦁             The first line in bullet list.
⦁   Second line.
⦁   Third line.

在第一行的文本开头之前插入了一堆空格。我不想那样。

当我从控件读回 RTF 时,现在是:

{\rtf1\ansi\ansicpg1252\deff0\nouicompat\deflang1033{\fonttbl{\f0\fnil\fcharset0 Microsoft Sans Serif;}{\f1\fnil\fcharset2 Symbol;}}

{\*\generator Riched20 10.0.14393}\viewkind4\uc1 

\pard{\pntext\f1\'B7\tab}{\*\pn\pnlvlblt\pnf1\pnindent0{\pntxtb\'B7}}\fi-180\li260\f0\fs24           \fs17 The first line in bullet list.\par

{\pntext\f1\'B7\tab}Second line.\par

{\pntext\f1\'B7\tab}Third line.\par

}

我已经阅读了 http://www.biblioscape.com/rtf15_spec.htm 和类似的资源,并了解了有关 RTF 的一般想法:

该格式应该会优雅地降级,因此在执行较旧的阅读器不支持的新内容时,旧阅读器可以显示额外的格式以获得新格式的某种体面的视觉表示,而老读者会忽略它不知道的标签。

对于列表,第一行设置了以下几行遵循的某种样式。我已经尝试修改上面格式中的所有数字常量,我看到渲染是如何根据我的更改向左或向右移动的,但额外的空格仍然存在。

我觉得也很奇怪,当我从文本控件读回 RTF 时,似乎突然出现了一个额外的 \fs24

如果有任何帮助或解决方案能够保留 list 方面,而不仅仅是在视觉上呈现列表,那也会很有帮助。原因是该程序稍后会将 RTF 转换为 HTML,如果它知道直接创建 <ul><ol> 标记,而不仅仅是例如项目符号字符和新段落,将会很有帮助。

【问题讨论】:

  • 在 SO 上有 RTF 的列表示例,但这些都不适合我。也许它们在 Word 中工作得更好,我不知道,但在文本控件中我无法让它们工作。
  • 你为什么要标记 c# 和 vb.net?你用的是哪一个?
  • @Simo,这个 VS 解决方案支持两种语言,但老实说,我只是在寻找更多可能熟悉这些问题的眼球。
  • 尝试使用写字板创建一个列表,然后在文本编辑器中检查保存的文件。
  • 您可能有一个限制标准,需要在访问 Html 的过程中通过 RTF,但如果可能的话,我会避免这样做。万一您不知道,您可以将 WebBrowser 控件用作 Html 编辑器。 Here is one such example.

标签: c# .net vb.net winforms rtf


【解决方案1】:

RichTextBox 有一个SelectionBullet 属性,它为选定的文本打开项目符号。

如果要为选定的文本设置项目符号,可以使用:

richTextBox1.SelectionBullet = true;

如果要插入项目符号文本,可以使用:

var i = richTextBox1.SelectionStart;
var txt = "Lorem\nipsum\ndolor\n";
richTextBox1.SelectedText = txt;
richTextBox1.Select(i, txt.Length);
richTextBox1.SelectionBullet = true;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-14
    相关资源
    最近更新 更多