2

我在 .NET 2.0 中使用 System.Windows.Forms.RichTextBox 控件,并且正在使用 c#。

我有一个要附加到 RichTextBox 的字符串数组,但我不想在 RTF 中创建新段落。我希望这些行被 \line 命令分割,而不是 RTF 中的 \par 命令。(我想模拟某人输入 shift+enter 而不是只输入。)

我无法成功让 RichTextBox.AppendText 生成 \line 命令而不是 \par 命令。所以我一直在插入我的文本,然后手动将 \line 命令插入到 RTF 本身。

当其中一个字符串包含在 RTF 中转义的字符(例如,单个 closequote 转换为 \rquote)时,这将失败,因为我无法找到插入到 RTF 中的原始字符串。

使用此解决方案,我需要先将行中的字符转义,然后再在 RTF 中搜索它。

有没有办法让 RichTextBox 控件生成 \line 命令而不是 \par 命令,或者我必须坚持使用此解决方案并搜索 RTF 转义字符串。

这是我当前的代码:

string[] lines = textInfo.Lines;

for (int i = 0; i < lines.Length; i++)
{
    rtb.AppendText(lines[i]);

    if (i < lines.Length - 1)
    {
        string rtf = rtb.Rtf;

        int insertedIndex = rtf.LastIndexOf(lines[i]);

        int length = lines[i].Length;

        rtf = rtf.Insert(insertedIndex + length, @"\line");

        rtb.Rtf = rtf;
    }
}
4

1 回答 1

1

当您修改其中任何一个时,RichTextBox 控件会自动更新 Text 和 Rtf 属性。任何附加到 Text 属性的文本都将自动更新为 RTF 属性。

通过一些快速测试,RichTextBox 控件似乎自动将 \par 插入到任何换行符(控件上的输入、shift-enter 和 Text 属性上的 \r \n \r\n Environment.NewLine 以及控制自己)。这是您报告的问题。

我不相信有任何方法可以改变控件生成 RTF 的方式。我只是追加文本,让 RichTextBox 控件处理可能需要转义的任何字符的转换,然后将所有 \par 替换为 \line。

假设 textInfo 是一个 TextBox 并且您希望将其内容附加到一些已经存在的 RTF 的末尾(如果不替换 += for = 在第 1 行

rtb.Text += textInfo.Text;

rtb.Rtf = rtb.Rtf.Replace(@"\par", @"\line");

编辑:

由于您逐行将行附加到文档中,并且您知道控件会为 \r\n 生成 \par,因此您可以将一些独特的文本(您可以在此处获得创意,我使用 REPLN)后缀到您想要的行用 \line 打断。当然,您必须能够识别要替换的行,我假设您从问题中做到了。附加您的唯一文本后,您可以再次将 REPLN\par 替换为 \line。不像我希望的那样优雅,但它完成了工作。

foreach (string line in textInfo.Lines)
{
   //assuming your condition is that the string contains the substring, "substring"
   rtb.AppendText(line + (line.Contains("substring") ? "REPLN\r\n" : "\r\n"));
}

rtb.Rtf = richTextBox1.Rtf.Replace(@"REPLN\par", @"\line");
于 2009-06-26T02:47:00.267 回答