C# 记事本中的RichTextBox复制问题

C# 记事本中的RichTextBox复制问题,c#,winforms,richtextbox,clipboard,C#,Winforms,Richtextbox,Clipboard,我使用以下代码更改了使用剪贴板从RTB动态复制的文本的一些格式 public static void CustomCopy(RichTextBox rtb) { rtb.Copy(); var _inMemoryRtb=new RichTextBox(); var iData = Clipboard.GetDataObject(); if (iData.GetDataPresent(DataFormat

我使用以下代码更改了使用剪贴板从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时,它会工作,但如果粘贴到浏览器/记事本,则不会发生任何事情。
问题出在哪里?

如果不依赖“RTF支持环境”(如Word),您将无法得到想要的<代码>数据格式.Rtf在
剪贴板中。SetData
避免任何Rtf非支持程序无法处理此数据

一个
RichTextBox
,其中的文本很容易被误解为文本+其他内容,但它是一种完全不同的格式。更好地理解这一点的快速实验:在代码
Clipboard.SetData(DataFormats.Rtf,_inMemoryRtb.Rtf)中替换与剪贴板.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.SetText(rtb.Text, TextDataFormat.Text);
澄清


原始OP的代码正在复制RTF信息,这是非RTP支持程序无法理解的。此代码在正确的条件下工作(源程序和目标程序支持RTF)。以前的更新是指只复制文本,而不考虑格式。因此,如果您希望在可能的情况下复制RTF格式的文本(RichTextBox到RichTextBox),而在其他情况下只复制文本(RichTextBox到记事本),那么您应该将这两个代码写在一起(原始OP的一个和前面提到的
SetText
)。

您能告诉我们您使用的确切环境吗?在winforms.NET 4.0/4.5中,我没有将SelectionUnderlineStyle作为RichTextBox的属性,实际上我使用的是RichTextBox的自定义版本。只需更改任何其他标准RTB方法并选中@varocabas,您必须描述确切的约束(/输入),以帮助我们理解问题并提出解决方案。如果您使用自定义RTB,您应该添加相关代码(或者您应该使用标准控件测试您的条件,并确认/排除行为相同)。对于此处引用的问题,自定义RTB没有任何特殊之处。请忘记自定义RTB,将其更改为普通标准winform RTB。将“SelectionUnderlineStyle”更改为SelectionBackColor,然后请检查问题@VaroCarbas明白了(没有检查;只是给出了一个一般性的答案:正确描述输入条件)。您无法得到您想要的(RTF格式为非RTF支持程序)。您必须选择要存储在剪贴板中的内容(rtf内容或richtextbox中的文本(纯文本));或者提出一种“翻译后算法”,能够处理文本中的RTF信息。好的,有一点很清楚,因为剪贴板数据是RTF格式的,所以Word可以理解并呈现它,而记事本不能。但是,如果我从word(一些带有格式的文本)复制并粘贴到记事本,它将显示文本,而RTB将显示格式化的文本,这是怎么回事@varocaros(varocarbas,但你不需要给我的尼克写信,因为在我的问题中,我得到了信息)。您是作为rtf复制/粘贴的人;当您依靠RTF从Word复制/粘贴文本时,您也会遇到同样的问题;如果依赖默认设置,您将获得标准行为,也就是说:如果程序不支持该格式,则只支持文本;如果程序支持该格式,则只支持该格式。我的要求是,如果我从RTB复制,并且它具有下划线文本,则将其从剪贴板中删除,以便当用户在Word中粘贴/控制+v时,不应存在下划线。我们怎么做?事实上我做到了,但如果我把它粘贴到记事本上,什么都不会发生。要求是更改剪贴板data@jeff你必须依靠SetText。将立即更新我的答案。好的,我将尝试还原