我有一个使用 RichTextBox 渲染RichText的复杂方法。 如果富文本不适合页面,我使用 SelectionStart,SelectionLength 和 SelectedRtf 属性来获取富文本的一部分。 但在获得富文本的一部分后,一些段落格式丢失了。 例如,行间距。
如何使用标准.Net Framework方法以正确的格式获取部分富文本?
我不需要只使用格式化复制富文本。如果不适合在一个页面中,我需要拆分富文本。如果有任何段落格式,它就会丢失。以下是左边距和行间距丢失的示例。
答案 0 :(得分:1)
好的,由于您实际需要的复杂性,我不确定富文本框是否是正确的解决方案。我知道你可能已经花了一些时间来实现它,但是听我说 - 你会遇到很多问题这里有你正在做的分裂,因为在很多情况下,文本的格式是您正在复制并不容易提取,并且不需要花太多时间来实现复杂和非标准的RTF格式。
如果您正在做的事情非标准,那么试图让RTF做您想要它做的事情。在这些情况下它始终是值得回溯,并运行一些其他选项。请考虑使用HTML控件,然后您想要添加的任何未来功能也可能更容易。
根据您所需的复杂性和其他功能,我建议您使用现有的HTML处理控件并花一点钱。节省时间是荒谬的。
(我不隶属于这家公司,但我之前使用过此控件)
如果您坚持使用RTF,即使是您所描述的简单任务,您也几乎总是遇到困难。另一方面,使用HTML,可以迅速解决这样的问题,因为任何格式都可以作为CSS应用于整个“框”或单个元素,可以轻松复制/提取。
答案 1 :(得分:0)
如果您希望保留段落格式,则需要复制格式代码,格式代码可能会从文本中的选择点开始。您需要找到相关的格式部分,并确保新页面/段落上的新部分与它们重复。
以下是一个关于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
}
答案 2 :(得分:0)
FlowDocument的WPF版本是唯一真正的C#控件,它允许以相当简单的方式设置段落。在WinForms中,RTF manual将成为真正的朋友。
正如您在放置的示例中看到的那样,行高和初始缩进的格式设置在第1页的某处,而缩进则在第2页的第二行设置。
这是因为如手册中所述“控制词(在段落 - 文本语法描述中描述)指定了通用段落格式化属性。这些控制词可以出现在段落的正文中,而不是就在开头。“
这意味着您必须注入RTF代码。这可以通过使用rt.Rtf = rt.Rtf.Insert(pos,“code”)来完成;
\ pagebb可用于从段落开始拆分页面。如果在你的情况下这是可能的,它将导致从包含10的行中断。这是可能的......
在您的选择中找到第一个\ pard,然后将其从SelectedRtf中删除。这将允许重复使用段落中的值。如果这样做,您还需要将新段落中的设置复制/移动到第一个。
您的样本显示您需要查找\ fiN(第一行缩进)和\ slN(行间距)
根据具体情况,我会实现在SelectionStart之前找到第一个\ par,以及在SelectionStart之后找到第一个和第二个。删除第一个和第二个\ par之间的所有\ pard,并插入我在第二个和第三个之间找到的所有段落代码。没有那么多,并列出here。