2010-10-15 46 views
7

我可以在剪貼板中存儲多於一種的類型嗎?例如。像文字&圖像。說用戶在文本編輯器中粘貼,他得到的文本,如果他粘貼像Photoshop一樣的東西,他得到的形象。我認爲這是可能的,但我想C#/ WPF:我可以在剪貼板中存儲更多的1種類型嗎?

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

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

Clipboard.SetImage(bitmapImage); 

,我總是得到的圖像

+0

嘛,據我所知,只有一個剪貼板插槽,因爲你把最後的圖像,這將有預期... – flq 2010-10-15 10:44:45

回答

11

是的,這是可能的。主要的問題是,在放置數據之前你使用清除剪貼板的方法(這就是爲什麼他們特別命名爲「Set ...」而不是「Add ...」)。從MSDN

Clipboard.SetText (WinForms)/Clipboard.SetText (WPF)描述:

(的WinForms):清除剪貼板,然後添加在文本或UnicodeText形式的文本數據,根據操作系統上。

但解決方法比較簡單:

要置於多種格式的剪貼板中的數據,使用DataObject類或IDataObject實現。將數據以多種格式放置在剪貼板上,以最大限度地提高目標應用程序(可能不知道其格式要求)能否成功檢索數據的可能性。

檢查MSDN的詳細信息:


UPDATE:

添加了WPF變體的鏈接。

爲了澄清@比約恩評論:

的MSDN頁System.Windows.Clipboard.SetText()沒有規定剪貼板被清除,儘管這似乎是這樣

這兩種方法(WPF/WinForms)內部調用OleSetClipboard,因此行爲類似(您可以檢查http://referencesource.microsoft.com/#q=Clipboard.SetText)。

我也在控制檯應用程序中檢查了兩種變體(WinForms/WPF),發現他們也是這樣做的。

+0

對不起,我遲到了;我最近試圖在剪貼板上同時獲取一張圖片和一些文字,但它不起作用。我的代碼是這樣的: 'dataObject.SetText( 「leText」);'' dataObject.SetImage(MYIMAGE);'' Clipboard.SetDataObject(dataObject時);' 爲了使工作我添加了一個額外的布爾值「true」到SetDataObject方法: 'Clipboard.SetDataObject(dataObject,true);' 檢查出答案[here](http://stackoverflow.com/questions/9032673/clipboard-copying-objects -to-from和from) – 2015-04-25 15:44:20

+0

MSDN的鏈接實際上是System.Windows.Forms.Clipboard,而不是System.Windows.Clipboard(WPF應該使用)。 System.Windows.Clipboard.SetText()的MSDN頁面沒有聲明剪貼板已被清除,儘管似乎是這種情況。 – 2016-06-14 12:07:55

4

正如Nick在接受的答案中所說:您必須使用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);