C#/ WPF:我可以在剪贴板中存储多于1种类型吗?

Jie*_*eng 8 c# wpf clipboard

我可以在剪贴板中存储多种类型吗?例如.像文字和图像.假设用户在文本编辑器中粘贴,他得到文本,如果他粘贴像photoshop这样的东西,他就会得到图像.我认为这是可能的,但我试过了

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

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

Clipboard.SetImage(bitmapImage);
Run Code Online (Sandbox Code Playgroud)

我总是得到这个形象

Nic*_*nko 11

对的,这是可能的.主要问题是,在放入数据之前使用清晰剪贴板的方法(这就是为什么特别是它们命名为"Set ..."而不是"Add ...").

来自MSDN的Clipboard.SetText(WinForms)/Clipboard.SetText(WPF)描述:

(WinForms):清除剪贴板,然后以Text或UnicodeText格式添加文本数据,具体取决于操作系统.

但解决方案相对容易:

要以多种格式将数据放在剪贴板上,请使用DataObject类或IDataObject实现.以多种格式将数据放在剪贴板上,以最大限度地提高您可能不知道其格式要求的目标应用程序可以成功检索数据的可能性.

检查MSDN以获取详细信息:


更新:

添加了WPF变体的链接.

澄清@Björn评论:

System.Windows.Clipboard.SetText()的MSDN页面没有说明剪贴板已清除,即使这似乎是这种情况

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

我还在控制台应用程序中检查了两个变体(WinForms/WPF)并发现它们也是如此.


Bjö*_*örn 5

正如尼克在接受的答案中所说:你必须使用DataObject(或IDataObject)来使用多种格式(否则每个Set-call将首先清除剪贴板).
这是一个代码示例:

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);
Run Code Online (Sandbox Code Playgroud)