DataPackage.SetDataProvider(String, DataProviderHandler) 메서드
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
대상 앱의 요청을 처리할 대리자를 설정합니다.
public:
virtual void SetDataProvider(Platform::String ^ formatId, DataProviderHandler ^ delayRenderer) = SetDataProvider;
void SetDataProvider(winrt::hstring const& formatId, DataProviderHandler const& delayRenderer);
public void SetDataProvider(string formatId, DataProviderHandler delayRenderer);
function setDataProvider(formatId, delayRenderer)
Public Sub SetDataProvider (formatId As String, delayRenderer As DataProviderHandler)
매개 변수
- formatId
-
String
Platform::String
winrt::hstring
데이터의 형식을 지정합니다. StandardDataFormats 클래스를 사용하여 이 값을 설정하는 것이 좋습니다.
- delayRenderer
- DataProviderHandler
대상 앱의 요청을 처리하는 대리자입니다.
예제
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;
using Windows.Storage;
using Windows.Storage.Pickers;
using Windows.Storage.Streams;
using Windows.UI.Xaml.Media.Imaging;
using Windows.Storage;
using Windows.Storage.Pickers;
using Windows.Storage.Streams;
using Windows.UI.Xaml.Media.Imaging;
using Windows.ApplicationModel.DataTransfer;
using Windows.Graphics.Imaging;
namespace ShareMainBetaCS
{
public sealed partial class ShareFiles : Page
{
private StorageFile imageFile = null;
private RandomAccessStreamReference imageStreamRef = null;
private RandomAccessStreamReference dataPackageThumbnail = null;
private IRandomAccessStream imageStream = null;
public ShareFiles()
{
this.InitializeComponent();
pickImageButton.Click += new RoutedEventHandler(pickImageButton_Click);
this.ShareSourceLoad();
}
async void pickImageButton_Click(object sender, RoutedEventArgs e)
{
FileOpenPicker imagePicker = new FileOpenPicker
{
ViewMode = PickerViewMode.Thumbnail,
SuggestedStartLocation = PickerLocationId.PicturesLibrary,
FileTypeFilter = { ".jpg", ".png", ".bmp", ".gif", ".tif" }
};
this.imageFile = await imagePicker.PickSingleFileAsync();
if (this.imageFile != null)
{
this.imageStreamRef = RandomAccessStreamReference.CreateFromFile(this.imageFile);
this.dataPackageThumbnail = this.imageStreamRef;
this.imageStream = await this.imageFile.OpenAsync(FileAccessMode.Read);
}
}
public void ShareSourceLoad()
{
DataTransferManager datatransferManager;
datatransferManager = DataTransferManager.GetForCurrentView();
datatransferManager.DataRequested += new TypedEventHandler<DataTransferManager, DataRequestedEventArgs>(this.DataRequested);
}
void DataRequested(DataTransferManager sender, DataRequestedEventArgs e)
{
e.Request.Data.Properties.Title = "Hello World!";
e.Request.Data.Properties.Description = "This example shows how to use delayed sharing.";
if (this.dataPackageThumbnail != null)
{
e.Request.Data.Properties.Thumbnail = this.dataPackageThumbnail;
}
e.Request.Data.SetDataProvider(StandardDataFormats.Bitmap,
new DataProviderHandler(this.OnDeferredImageRequestedHandler));
}
async void OnDeferredImageRequestedHandler(DataProviderRequest request)
{
// Here we provide updated Bitmap data using delayed rendering
if (this.imageStream != null)
{
DataProviderDeferral deferral = request.GetDeferral();
try
{
InMemoryRandomAccessStream inMemoryStream = new InMemoryRandomAccessStream();
// Decode the image
BitmapDecoder imageDecoder = await BitmapDecoder.CreateAsync(this.imageStream);
// Re-encode the image at 50% width and height
BitmapEncoder imageEncoder = await BitmapEncoder.CreateForTranscodingAsync(inMemoryStream, imageDecoder);
imageEncoder.BitmapTransform.ScaledWidth = (uint)(imageDecoder.OrientedPixelHeight * 0.5);
imageEncoder.BitmapTransform.ScaledHeight = (uint)(imageDecoder.OrientedPixelHeight * 0.5);
await imageEncoder.FlushAsync();
request.SetData(RandomAccessStreamReference.CreateFromStream(inMemoryStream));
}
catch (Exception ex)
{
// Handle the exception
}
finally
{
deferral.Complete();
}
}
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
}
}
}
설명
앱이 특정 형식을 지원하지만 대상 앱이 요청할 때까지 데이터를 제공하지 않으려는 경우 SetDataProvider 메서드를 사용합니다. 앱이 상당한 처리 시간이 필요할 수 있는 콘텐츠를 공유하는 경우 이 방법을 사용하는 것이 좋습니다. 예를 들어 사진, 비디오 또는 파일의 선택을 공유합니다.
이 메서드를 사용하는 경우 형식과 함수를 지정해야 합니다. StandardDataFormats 클래스를 사용하여 형식을 지정하거나 사용자 지정 형식에 문자열 값을 사용할 수 있습니다. 함수는 SetData와 같은 메서드를 사용하여 DataPackage에 데이터를 배치해야 합니다.
공유 대상에 전달되는 StorageItems 의 확장을 지정해야 합니다.
SetDataProvider 메서드는 DataRequest 클래스의 GetDeferral 메서드와 다릅니다. GetDeferral을 사용하면 원본 앱이 DataPackage 개체에 데이터를 즉시 배치하는 함수를 호출할 수 있습니다. SetDataProvider 메서드는 공유할 데이터를 패키징하는 것이 시간이 더 많거나 리소스를 많이 사용하는 보다 복잡한 공유 작업을 위한 것입니다.