剪貼簿是應用程式間資料交換的核心通道。Windows 8 Store Apps 透過 Windows.ApplicationModel.DataTransfer.Clipboard 靜態類別,配合 DataPackage/DataPackageView 提供豐富的資料格式支援。本文系統介紹文字、HTML、圖片、檔案的複製貼上,以及進階的延遲渲染與資料提供者模式。
| 類別 | 角色 | 關鍵成員 |
|---|---|---|
| Clipboard | 剪貼簿靜態存取點 | SetContent()、GetContent()、Clear()、Flush()、ContentChanged 事件 |
| DataPackage | 可寫入資料容器(放入剪貼簿/共享) | SetText/HtmlFormat/Bitmap/StorageItems/Data/DataProvider、Properties、RequestedOperation |
| DataPackageView | 唯讀資料視圖(從剪貼簿/共享取得) | Contains()、GetTextAsync/HtmlFormatAsync/BitmapAsync/StorageItemsAsync/DataAsync、AvailableFormats |
| HtmlFormatHelper | HTML 片段封裝/解析工具 | CreateHtmlFormat()、GetStaticFragment() |
// 複製文字到剪貼簿
var dataPackage = new DataPackage();
dataPackage.SetText($"我是 webabcd: {DateTime.Now}");
Clipboard.SetContent(dataPackage);
Clipboard.Flush(); // 應用關閉後仍保留
// 從剪貼簿貼上文字
var view = Clipboard.GetContent();
if (view.Contains(StandardDataFormats.Text)) {
string text = await view.GetTextAsync();
txtOutput.Text = text;
}
// 監聽剪貼簿變化
Clipboard.ContentChanged += (s, e) => { /* 更新 UI */ };
HTML 片段需經 HtmlFormatHelper.CreateHtmlFormat 封裝標準標頭,貼上時用 GetStaticFragment 還原:
// 複製 HTML
var html = "粗體 斜體 紅字";
var dataPackage = new DataPackage();
dataPackage.SetHtmlFormat(HtmlFormatHelper.CreateHtmlFormat(html));
Clipboard.SetContent(dataPackage);
// 貼上 HTML
var view = Clipboard.GetContent();
if (view.Contains(StandardDataFormats.Html)) {
string packaged = await view.GetHtmlFormatAsync();
string fragment = HtmlFormatHelper.GetStaticFragment(packaged);
// fragment 即原始 "粗體 ..."
}
var dataPackage = new DataPackage();
dataPackage.SetBitmap(RandomAccessStreamReference.CreateFromUri(
new Uri("ms-appx:///Assets/Logo.png")));
Clipboard.SetContent(dataPackage);
適用於資料生成耗時(如大圖縮放、格式轉換)的場景,透過 SetDataProvider 註冊提供者:
var imageFile = await StorageFile.GetFileFromApplicationUriAsync(
new Uri("ms-appx:///Assets/Logo.png"));
var dataPackage = new DataPackage();
dataPackage.SetDataProvider(StandardDataFormats.Bitmap, async request => {
// 使用者執行「貼上」時才進入此處
var deferral = request.GetDeferral(); // 開始異步操作
try {
using (var stream = await imageFile.OpenAsync(FileAccessMode.Read)) {
var decoder = await BitmapDecoder.CreateAsync(stream);
var memStream = new InMemoryRandomAccessStream();
var encoder = await BitmapEncoder.CreateForTranscodingAsync(memStream, decoder);
encoder.BitmapTransform.ScaledWidth = (uint)(decoder.OrientedPixelWidth * 0.5);
encoder.BitmapTransform.ScaledHeight = (uint)(decoder.OrientedPixelHeight * 0.5);
await encoder.FlushAsync();
request.SetData(RandomAccessStreamReference.CreateFromStream(memStream));
}
} finally {
deferral.Complete(); // 通知完成
}
});
Clipboard.SetContent(dataPackage);
// 複製檔案到剪貼簿
var file = await ApplicationData.Current.LocalFolder.CreateFileAsync(
@"webabcdTest\clipboard.txt", CreationCollisionOption.ReplaceExisting);
await FileIO.WriteTextAsync(file, $"內容: {DateTime.Now}");
var dataPackage = new DataPackage();
dataPackage.SetStorageItems(new List { file });
dataPackage.RequestedOperation = DataPackageOperation.Move; // 建議移動而非複製
Clipboard.SetContent(dataPackage);
// 貼上檔案並儲存到指定路徑
var view = Clipboard.GetContent();
if (view.Contains(StandardDataFormats.StorageItems)) {
var items = await view.GetStorageItemsAsync();
var storageFile = items.First() as StorageFile;
if (storageFile != null) {
var destFile = await storageFile.CopyAsync(
ApplicationData.Current.TemporaryFolder,
storageFile.Name,
NameCollisionOption.ReplaceExisting);
// destFile 即貼上後的檔案
}
}
雙方約定格式識別碼(如 "https://myapp/customformat"),來源端 SetData,目標端 GetDataAsync。需在 Package.appxmanifest 宣告共用目標支援的格式。
單一 DataPackage 可同時包含文字、HTML、圖片等多種格式,目標應用自行選擇最適合的格式:
var dataPackage = new DataPackage();
dataPackage.SetText("純文字版本");
dataPackage.SetHtmlFormat(HtmlFormatHelper.CreateHtmlFormat("HTML 版本"));
dataPackage.SetBitmap(imageRef);
Clipboard.SetContent(dataPackage);
預設應用關閉時剪貼簿資料清除。呼叫 Clipboard.Flush() 後,資料將保留至系統重啟或被新資料覆蓋。
GetXxxAsync 必須 await,切勿 .Result 導致 UI 凍結。SetDataProvider,避免複製時卡頓。Move 可避免重複檔案殘留,目標端貼上後來源可自動清理。SetHtmlFormat 未經 HtmlFormatHelper.CreateHtmlFormat 會導致貼上失敗或格式錯亂。InMemoryRandomAccessStream、IRandomAccessStream 用完需 using 或手動 Dispose。| 格式 | StandardDataFormats 常數 | Set 方法 | Get 方法 | 資料型別 |
|---|---|---|---|---|
| 純文字 | Text | SetText | GetTextAsync | string |
| URI | Uri | SetUri | GetUriAsync | Uri |
| HTML | Html | SetHtmlFormat | GetHtmlFormatAsync | string (需解析) |
| RTF | Rtf | SetRtf | GetRtfAsync | string |
| 位圖 | Bitmap | SetBitmap | GetBitmapAsync | IRandomAccessStreamReference |
| 儲存項目 | StorageItems | SetStorageItems | GetStorageItemsAsync | IReadOnlyList |
| 自訂 | 自訂字串 | SetData | GetDataAsync | object |
掌握剪貼簿的多格式支援與延遲渲染機制,能為使用者提供流暢、強大的跨應用複製貼上體驗。