在记事本中的RichTextBox复制问题

时间:2013-10-06 09:00:14

标签: c# winforms richtextbox clipboard

我使用以下代码使用剪贴板动态更改从RTB复制的文本中的某些格式

 public static void CustomCopy(RichTextBox rtb)
      {
          rtb.Copy();
          var _inMemoryRtb=new RichTextBox();
          var iData = Clipboard.GetDataObject();
          if (iData.GetDataPresent(DataFormats.Rtf))
          {
              _inMemoryRtb.Rtf = (string)Clipboard.GetData(DataFormats.Rtf);

                  _inMemoryRtb.SelectAll();
                 _inMemoryRtb.SelectionBackColor = Color.Red;
                 Clipboard.SetData(DataFormats.Rtf, _inMemoryRtb.Rtf);


          }

          _inMemoryRtb.Clear();
      }

当我将复制的文本粘贴到Word / Wordpad时,它可以正常工作,但如果我粘贴到浏览器/记事本,则没有任何反应。 这个问题在哪里?

1 个答案:

答案 0 :(得分:1)

如果不依赖“RTF支持环境”,就无法得到你想要的东西。 DataFormats.Rtf中的Clipboard.SetData可以避免任何不支持RTF的程序无法处理此数据。

A RichTextBox,其中的文字往往容易被误解为文本+其他内容,但它是一种完全不同的格式。快速实验可以更好地理解这一点:在代码Clipboard.SetData(DataFormats.Rtf, _inMemoryRtb.Rtf);中替换为Clipboard.SetData(DataFormats.Text, _inMemoryRtb.Rtf);。您现在看到的是RTF内容的未编码版本,即任何程序能够看到的内容。请记住,他不可理解的文本可以很容易地转换回RTF:

Clipboard.SetData(DataFormats.Text, _inMemoryRtb.Rtf);
var iData2 = Clipboard.GetDataObject();
rtb.Rtf = (string)Clipboard.GetData(DataFormats.Text);

更新

使用您的代码,您将粘贴RTF信息(无法通过非支持RTF的程序处理,如记事本)。如果您只想将文字粘贴到rtb,请依赖SetText:您将在ClipBoard中存储要粘贴的文本(独立于给定格式),此信息将被任何程序“理解”。

Clipboard.SetText(rtb.Text, TextDataFormat.Text);

澄清

原始OP的代码是复制RTF信息,这是非RTP支持程序无法理解的。此代码在适当的条件下工作(源和目标程序支持的RTF)。以前的更新是指无论格式如何都只复制文本。因此,如果你想要的是尽可能复制RTF格式的文本(RichTextBox到RichTextBox)而只是文本(RichTextBox到记事本),你应该将两个代码一起写(原始OP的一个和前面提到的SetText)。 / p>