本文示範分享來源應用的三步驟實作、分享目標應用的清單宣告與啟動處理、快速連結回傳機制,以及 DataTransferManager 核心 API 使用。
在欲分享的頁面 OnNavigatedTo 註冊,OnNavigatedFrom 註銷。
protected override void OnNavigatedTo(NavigationEventArgs e) {
DataTransferManager.GetForCurrentView().DataRequested += OnDataRequested;
}
protected override void OnNavigatedFrom(NavigationEventArgs e) {
DataTransferManager.GetForCurrentView().DataRequested -= OnDataRequested;
}

private void OnDataRequested(DataTransferManager sender, DataRequestedEventArgs args) {
var request = args.Request;
request.Data.Properties.Title = "文章標題";
request.Data.Properties.Description = "分享描述文字";
request.Data.SetText("要分享的主要文字內容");
request.Data.SetUri(new Uri("https://example.com/article"));
request.Data.SetHtmlFormat(HtmlFormatHelper.CreateHtmlFormat("HTML 內容"));
// 圖片
var imageFile = await Package.Current.InstalledLocation.GetFileAsync("Assets/share.jpg");
request.Data.SetBitmap(RandomAccessStreamReference.CreateFromFile(imageFile));
// 縮圖
request.Data.Properties.Thumbnail = RandomAccessStreamReference.CreateFromFile(imageFile);
}

避免記憶體洩漏與重複觸發。

在 Package.appxmanifest「宣告」添加「分享目標」,勾選支援格式(文字、URI、圖片等)。

在 App.xaml.cs 重寫 OnShareTargetActivated:
protected override void OnShareTargetActivated(ShareTargetActivatedEventArgs args) {
var rootFrame = new Frame();
rootFrame.Navigate(typeof(ShareTargetPage), args.ShareOperation);
Window.Current.Content = rootFrame;
Window.Current.Activate();
}

protected override void OnNavigatedTo(NavigationEventArgs e) {
var shareOperation = e.Parameter as ShareOperation;
if (shareOperation != null) {
var data = shareOperation.Data;
// 取得文字
if (data.Contains(StandardDataFormats.Text)) {
var text = await data.GetTextAsync();
txtContent.Text = text;
}
// 取得圖片
if (data.Contains(StandardDataFormats.Bitmap)) {
var streamRef = await data.GetBitmapAsync();
var stream = await streamRef.OpenReadAsync();
var bitmap = new BitmapImage();
await bitmap.SetSourceAsync(stream);
imgShared.Source = bitmap;
}
// 取得 URI
if (data.Contains(StandardDataFormats.Uri)) {
var uri = await data.GetUriAsync();
txtUri.Text = uri.AbsoluteUri;
}
}
}

分享完成後回傳 QuickLink,下次分享面板優先顯示。
var quickLink = new QuickLink {
Id = "shareToMyApp",
Title = "分享到我的應用",
SupportedDataFormats = { StandardDataFormats.Text, StandardDataFormats.Bitmap },
Thumbnail = RandomAccessStreamReference.CreateFromUri(
new Uri("ms-appx:///Assets/quicklink-icon.png"))
};
shareOperation.ReportCompleted(quickLink);

if (shareOperation.QuickLinkId == "shareToMyApp") {
// 針對快速連結的特殊處理邏輯
}
| 成員 | 類型 | 說明 |
|---|---|---|
| DataRequested | 事件 | 分享操作開始時觸發 |
| TargetApplicationChosen | 事件 | 目標應用被選擇時觸發 |
| GetForCurrentView() | 靜態方法 | 取得目前視圖的管理器實例 |
| ShowShareUI() | 靜態方法 | 程式化開啟分享面板 |
分享合約實作完成。下一章將介紹設定合約的原理與建構。