我有一个使用RichTextBox呈现 RichText 的复杂方法。如果富文本不适合页面,我使用SelectionStart、SelectionLength和SelectedRtf属性来获取富文本的一部分。但是在得到部分富文本之后,一些段落格式就丢失了。例如,行距。
如何使用标准的 .Net Framework 方法以正确的格式获取部分富文本?
我不需要只复制带有格式的富文本。如果它不适合一页,我需要拆分富文本。如果有任何段落格式,它就会丢失。这是一个丢失左边距和行距的示例。
我有一个使用RichTextBox呈现 RichText 的复杂方法。如果富文本不适合页面,我使用SelectionStart、SelectionLength和SelectedRtf属性来获取富文本的一部分。但是在得到部分富文本之后,一些段落格式就丢失了。例如,行距。
如何使用标准的 .Net Framework 方法以正确的格式获取部分富文本?
我不需要只复制带有格式的富文本。如果它不适合一页,我需要拆分富文本。如果有任何段落格式,它就会丢失。这是一个丢失左边距和行距的示例。
好的,由于您实际需要的复杂性,我不确定富文本框是正确的解决方案。我知道您可能已经花时间实现它,但请听我说 -您在进行拆分时会遇到很多问题,因为在许多情况下,您要复制的文本的格式并不容易extract 并且不需要太多就可以意识到 RTF 格式是多么复杂和非标准。
如果您正在做的事情是非标准的,那么试图让 RTF 做您想做的事情是不值得的。在这些情况下,总是值得回溯,并与其他一些选项一起运行。考虑改用 HTML 控件,然后您想要添加的任何未来功能也可能会更容易。
并且根据您需要的复杂性和其他功能,我建议您使用现有的 HTML 处理控件,只需花一点钱就可以了。这里节省的时间是荒谬的。
(我不隶属于这家公司,但我之前使用过这个控件)
如果您坚持使用 RTF,即使是您描述的简单任务,您几乎总是会遇到困难。另一方面,使用 HTML 可以迅速解决此类问题,因为任何格式都可以作为 CSS 应用于整个“盒子”或应用于可以轻松复制/提取的单个元素。
如果您想保留段落格式,则需要复制格式代码,该代码可能从文本中您的选择点上方开始。您需要找到相关的格式部分,并确保新页面/段落上的新部分与它们重复。
这是一个关于 RTF 中发生的事情的示例,您可以在其中看到不同段落的不同格式。
来自:http ://www.pindari.com/rtf1.htm
As it turns out I needed different tab sections for the second and third parts of my report. To accomplish this I simply started a new paragraph and redefined the tab stops with \par\pard\tx1440\tx2880 which gave me a tab stop at 1" and 2".
{\rtf1\ansi\deff0 {\fonttbl {\f0 Courier;}}
{\colortbl;\red0\green0\blue0;\red255\green0\blue0;}
\landscape
\paperw15840\paperh12240\margl720\margr720\margt720\margb720
\tx720\tx1440\tx2880\tx5760
This line is the default color\line
\tab this line has 1 tab\line
\tab\tab this line has 2 tabs\line
\tab\tab\tab this line has 3 tabs\line
\tab\tab\tab\tab this line has 4 tabs\line
\cf2
\tab This line is red and has a tab before it\line
\cf1
\page
\par\pard\tx1440\tx2880
This line is the default color and the first line on page 2\line
\tab\tab This is the second tab on the second line on the second page\line
}
FlowDocument 的 WPF 版本是唯一真正的 C# 控件,它允许以相当简单的方式获取段落设置。在 WinForms 中,RTF 手册将成为真正的朋友。
正如您在放置的示例中看到的,行高和初始缩进的格式设置在第 1 页的某处,而缩进设置在第 2 页的第二行。
这是因为如手册中所述,“控制词(如段落文本语法描述中所述)指定通用段落格式属性。这些控制词可以出现在段落正文的任何位置,而不仅仅是在开头。 ”
这意味着您将不得不注入 RTF 代码。这可以通过使用 rt.Rtf = rt.Rtf.Insert(pos,"code");
\pagebb 可用于从段落开始分割页面。如果在您的情况下这是可能的,它将导致包含 10 的行中断。它是 poss....
在您的选择中找到第一个 \pard,并将其从 SelectedRtf 中删除。这将允许重用段落中的值。如果您这样做,您还需要将新段落中的设置复制/移动到第一个。
您的示例显示您需要查找的是 \fiN (第一行缩进)和 \slN (行间距)
根据情况,我将实现在 SelectionStart 之前查找第一个 \par 以及在 SelectionStart 之后查找第一个和第二个。删除第一个和第二个 \par 之间的所有 \pard 并将我在第二个和第三个之间找到的所有段落代码插入第一个。没有那么多,这里列出来。