C# 记事本中的RichTextBox复制问题
我使用以下代码更改了使用剪贴板从RTB动态复制的文本的一些格式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
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。将立即更新我的答案。好的,我将尝试还原