C#:在RichTextBox中粘贴RTF,但保持着色和格式化(即:粗体,下划线等)

时间:2011-03-29 19:14:32

标签: c# winforms formatting richtextbox paste

是否可以将文本粘贴到富文本框中,同时保持字体在粘贴内容的富文本框中使用?

换句话说,我想从Word中复制一些格式化的内容(即:使用字体X并加下划线和蓝色的文本),然后将其粘贴到我的RichTextBox中。

我希望粘贴的内容与我的RichTextBox具有相同的字体,但保留其原始颜色并加下划线。

这样的事情可能吗?

我使用winforms。

由于

5 个答案:

答案 0 :(得分:3)

这不是开箱即用的。但你可以这样做:

public void SpecialPaste()
{
    var helperRichTextBox = new RichTextBox();
    helperRichTextBox.Paste();
    for(int i=0;i<helperRichTextBox.TextLength;++i)
    {
        helperRichTextBox.SelectionStart = i;
        helperRichTextBox.SelectionLength = 1;
        helperRichTextBox.SelectionFont = new Font(richTextBox1.SelectionFont.FontFamily, richTextBox1.SelectionFont.Size,helperRichTextBox.SelectionFont.Style);
    }

    richTextBox1.SelectedRtf = helperRichTextBox.Rtf;
}

这会将粘贴的RTF的字体更改为粘贴时插入位置前面的字符的字体。
如果您粘贴的文本很大(呃),我认为这会很快出问题。此外,这可以通过某种方式进行优化,它只为汉堡建议使用相同基本字体的行中的所有字符设置一次字体。

更新:
以下是优化版本,它使用相同的原始字体设置连接字符集的字体:

public void SpecialPaste()
{
    var helperRichTextBox = new RichTextBox();
    helperRichTextBox.Paste();
    helperRichTextBox.SelectionStart = 0;
    helperRichTextBox.SelectionLength = 1;

    Font lastFont = helperRichTextBox.SelectionFont;
    int lastFontChange = 0;
    for (int i = 0; i < helperRichTextBox.TextLength; ++i)
    {
        helperRichTextBox.SelectionStart = i;
        helperRichTextBox.SelectionLength = 1;
        if (!helperRichTextBox.SelectionFont.Equals(lastFont))
        {
            lastFont = helperRichTextBox.SelectionFont;
            helperRichTextBox.SelectionStart = lastFontChange;
            helperRichTextBox.SelectionLength = i - lastFontChange;
            helperRichTextBox.SelectionFont = new Font(richTextBox1.SelectionFont.FontFamily, richTextBox1.SelectionFont.Size, helperRichTextBox.SelectionFont.Style);
            lastFontChange = i;
        }
    }
    helperRichTextBox.SelectionStart = helperRichTextBox.TextLength-1;
    helperRichTextBox.SelectionLength = 1;
    helperRichTextBox.SelectionFont = new Font(richTextBox1.Font.FontFamily, richTextBox1.Font.Size, helperRichTextBox.SelectionFont.Style);

    richTextBox1.SelectedRtf = helperRichTextBox.Rtf;
}

这是非常丑陋的代码,我相信它可以改进和清理。但它确实应该做到。

答案 1 :(得分:1)

显然,如果剪贴板上的RTF包含带有/ font指令的片段,则无法按照您的方式工作。这很有可能。过滤RTF片段只能通过粘贴到帮助器RichTextBox来实现。使用SelectionFont属性,然后将其复制回剪贴板并粘贴()。或者直接做:

        int oldpos = richTextBox1.SelectionStart;
        richTextBox1.SelectionLength = 0;
        richTextBox1.Paste();
        int newpos = richTextBox1.SelectionStart;
        richTextBox1.SelectionStart = oldpos;
        richTextBox1.SelectionLength = newpos - oldpos;
        richTextBox1.SelectionFont = richTextBox1.Font;
        richTextBox1.SelectionStart = newpos;

答案 2 :(得分:1)

我知道这有点晚了,但我遇到了同样的问题,这是我的解决方案(希望这会有助于其他人):

首先,处理RichTextBox的KeyDown事件:

this.richTextBox.KeyDown += new System.Windows.Forms.KeyEventHandler(this.RichTextBoxKeyDown);

接下来,检查粘贴键事件并重新设置剪贴板文本(这是魔术发生的地方):

     private void RichTextBoxKeyDown(object sender, KeyEventArgs e)
        {
            if (e.Control && e.KeyCode == Keys.V)
            {
                try
                {
                    Clipboard.SetText(Clipboard.GetText());
                }
                catch (Exception)
                {
                }
            }
        }

说明: 我首先要说的是,这只是用.NET 4.0测试过的。假设所使用的所有函数都没有被更改,这也适用于旧版本的.NET。

调用Clipboard.GetText()以纯文本格式(不包括RTF标记)返回内容。然后我们通过使用从Clipboard.GetText()获取的纯文本调用Clipboard.SetText()来更改要粘贴的文本。现在,当事件完成并传递给控件时,它将执行粘贴从剪贴板中获取最新文本(我们的更改版本)。它被包装在try / catch块中的原因是因为SetText有时会抛出异常,即使它成功地将文本复制到剪贴板。您当然可以使用Clipboard提供的其他方法来获取/设置文本,这只是解决方案的基本版本。

新粘贴的文本将继承光标位置的格式,类似于手动输入RTB。

不幸的是,这也将删除文本的样式(粗体,着色等)

希望这有帮助!

答案 3 :(得分:1)

老了,我知道; Daniel的回答对我有用,但前提是我替换了richTextBox1.Selection的任何实例,只是简单地引用整个richTextBox1的字体和大小。在这种情况下,任何RTF I粘贴都将继承richTextBox1当前正在使用的fontfamily和fontsize,同时保留和RTF样式。

public void SpecialPaste()
{
    var helperRichTextBox = new RichTextBox();
    helperRichTextBox.Paste();
    helperRichTextBox.SelectionStart = 0;
    helperRichTextBox.SelectionLength = 1;

Font lastFont = helperRichTextBox.SelectionFont;
int lastFontChange = 0;
for (int i = 0; i < helperRichTextBox.TextLength; ++i)
{
    helperRichTextBox.SelectionStart = i;
    helperRichTextBox.SelectionLength = 1;
    if (!helperRichTextBox.SelectionFont.Equals(lastFont))
    {
        lastFont = helperRichTextBox.SelectionFont;
        helperRichTextBox.SelectionStart = lastFontChange;
        helperRichTextBox.SelectionLength = i - lastFontChange;
        helperRichTextBox.SelectionFont = new Font(richTextBox1.Font.FontFamily, richTextBox1.Font.Size, helperRichTextBox.SelectionFont.Style);
        lastFontChange = i;
    }
}
helperRichTextBox.SelectionStart = helperRichTextBox.TextLength-1;
helperRichTextBox.SelectionLength = 1;
helperRichTextBox.SelectionFont = new Font(richTextBox1.Font.FontFamily, richTextBox1.Font.Size, helperRichTextBox.SelectionFont.Style);

richTextBox1.Rtf = helperRichTextBox.Rtf;

}

答案 4 :(得分:0)

我尝试从word文档中复制文本并在运行时将其粘贴到RichTextBox。一切正常。我没有调整任何具体的东西。只需将RichTextBox放到表单上,然后从MS Word文档中复制格式化的文本。