C#/WPF:我能在剪贴板中存储多种类型吗?

9

我可以在剪贴板中存储多种类型的内容吗?例如,文本和图像。如果用户将内容粘贴到文本编辑器中,他将获得文本;如果将内容粘贴到像Photoshop这样的软件中,他将获得图像。我认为这是可能的,但我尝试过却没有成功。

Clipboard.Clear();
Clipboard.SetText(img.DirectLink);

BitmapImage bitmapImage = new BitmapImage();
bitmapImage.BeginInit();
bitmapImage.UriSource = new Uri(img.DirectLink);
bitmapImage.EndInit();

Clipboard.SetImage(bitmapImage);

我总是得到这个图像


据我所知,剪贴板中只有一个插槽,因为您最后放置了图像,所以这是可以预料的... - flq
2个回答

11
是的,这是可能的。主要问题是,您正在使用的方法在放置数据之前清除剪贴板(这就是为什么它们特别命名为“Set…”而不是“Add…”)。
来自 MSDN 的 Clipboard.SetText (WinForms) / Clipboard.SetText (WPF) 描述:
(WinForms):清除剪贴板,然后根据操作系统添加文本或 UnicodeText 格式的数据。
但解决方案相对容易:
要在多种格式下将数据放置到剪贴板上,请使用 DataObject 类或 IDataObject 实现。以多种格式将数据放置在剪贴板上,以最大化目标应用程序成功检索数据的可能性,您可能不知道其格式要求。
有关详细信息,请参阅 MSDN:
- WinForms: http://msdn.microsoft.com/en-us/library/25w5tzxb.aspx - WPF: http://msdn.microsoft.com/en-us/library/system.windows.clipboard.aspx

更新:

添加了WPF变体的链接。

为了澄清@Björn的评论:

System.Windows.Clipboard.SetText()的MSDN页面没有说明剪贴板会被清除,尽管事实似乎是这样的。

两种方法(WPF / WinForms)内部都调用OleSetClipboard,因此行为类似(您可以检查http://referencesource.microsoft.com/#q=Clipboard.SetText)。

我还在控制台应用程序中检查了两个变体(WinForms / WPF),发现它们做相同的事情。


抱歉我来晚了,最近我一直在尝试将图片和一些文本同时放到剪贴板上,但一直不成功。我的代码看起来像这样:dataObject.SetText("leText"); dataObject.SetImage(myImage); Clipboard.SetDataObject(dataObject);为了让它正常工作,我在SetDataObject方法中添加了一个额外的布尔值“true”:Clipboard.SetDataObject(dataObject, true);请在这里查看答案。 - George Flourentzos
链接到 MSDN 的实际上是 System.Windows.Forms.Clipboard,而不是 WPF 应该使用的 System.Windows.Clipboard。System.Windows.Clipboard.SetText() 的 MSDN 页面并未说明剪贴板已被清除,尽管事实似乎是如此。 - Björn

9
如Nick在被采纳的答案中所说:您必须使用DataObject(或IDataObject)来使用多个格式(否则每个Set调用将首先清除剪贴板)。 以下是一个代码示例:
BitmapImage bitmapImage = new BitmapImage();
bitmapImage.BeginInit();
bitmapImage.UriSource = new Uri(img.DirectLink);
bitmapImage.EndInit();

DataObject d = new DataObject();
d.SetImage(bitmapImage);
d.SetText(img.DirectLink);
Clipboard.SetDataObject(d);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接