首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

Windows 8 Store Apps 剪貼簿操作完整指南:文字、HTML、圖片、檔案與延遲渲染

     編輯:關於.NET

前言

剪貼簿是應用程式間資料交換的核心通道。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
HtmlFormatHelperHTML 片段封裝/解析工具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 格式:保留富文本結構

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);

檔案複製:StorageItems 格式


// 複製檔案到剪貼簿
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);

Flush():跨應用程式生命週期保留

預設應用關閉時剪貼簿資料清除。呼叫 Clipboard.Flush() 後,資料將保留至系統重啟或被新資料覆蓋。

最佳實踐與避坑

  1. 非同步 API 全程 await: 所有 GetXxxAsync 必須 await,切勿 .Result 導致 UI 凍結。
  2. 大資料使用延遲渲染: 圖片縮放、檔案壓縮等耗時操作放入 SetDataProvider,避免複製時卡頓。
  3. 檔案操作指定 RequestedOperation: Move 可避免重複檔案殘留,目標端貼上後來源可自動清理。
  4. HTML 必須封裝: 直接 SetHtmlFormat 未經 HtmlFormatHelper.CreateHtmlFormat 會導致貼上失敗或格式錯亂。
  5. 記憶體流釋放: InMemoryRandomAccessStream、IRandomAccessStream 用完需 using 或手動 Dispose。
  6. 跨應用驗證: 使用「記事本」驗證文字、「Word」驗證 HTML、「圖片檢視器」驗證圖片、「檔案總管」驗證檔案。

格式支援對照表

格式StandardDataFormats 常數Set 方法Get 方法資料型別
純文字TextSetTextGetTextAsyncstring
URIUriSetUriGetUriAsyncUri
HTMLHtmlSetHtmlFormatGetHtmlFormatAsyncstring (需解析)
RTFRtfSetRtfGetRtfAsyncstring
位圖BitmapSetBitmapGetBitmapAsyncIRandomAccessStreamReference
儲存項目StorageItemsSetStorageItemsGetStorageItemsAsyncIReadOnlyList
自訂自訂字串SetDataGetDataAsyncobject

掌握剪貼簿的多格式支援與延遲渲染機制,能為使用者提供流暢、強大的跨應用複製貼上體驗。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved