private async void OnDeferredImageRequestedHandler(DataProviderRequest request, DataPackage dp) { DataProviderDeferral deferral = request.GetDeferral(); try { StorageFile img = await PictureHandler.AsStorageFile(Items.SelectedItem.Pixels, "ToShare.jpg"); if (img != null) { List <IStorageFile> imageItems = new List <IStorageFile> { img }; dp.SetStorageItems(imageItems); RandomAccessStreamReference imageStreamRef = RandomAccessStreamReference.CreateFromFile(img); dp.Properties.Thumbnail = imageStreamRef; dp.SetBitmap(imageStreamRef); } } catch (Exception e) { throw e; } deferral.Complete(); }
private async void OnDeferredImageRequestedHandler(DataProviderRequest providerRequest, StorageFile imageFile) { // In this delegate we provide updated Bitmap data using delayed rendering. if (imageFile != null) { // If the delegate is calling any asynchronous operations it needs to acquire the deferral first. This lets the // system know that you are performing some operations that might take a little longer and that the call to // SetData could happen after the delegate returns. Once you acquired the deferral object you must call Complete // on it after your final call to SetData. DataProviderDeferral deferral = providerRequest.GetDeferral(); InMemoryRandomAccessStream inMemoryStream = new InMemoryRandomAccessStream(); // Make sure to always call Complete when done with the deferral. try { // Decode the image and re-encode it at 50% width and height. IRandomAccessStream imageStream = await imageFile.OpenAsync(FileAccessMode.Read); BitmapDecoder imageDecoder = await BitmapDecoder.CreateAsync(imageStream); BitmapEncoder imageEncoder = await BitmapEncoder.CreateForTranscodingAsync(inMemoryStream, imageDecoder); imageEncoder.BitmapTransform.ScaledWidth = (uint)(imageDecoder.OrientedPixelWidth * 0.5); imageEncoder.BitmapTransform.ScaledHeight = (uint)(imageDecoder.OrientedPixelHeight * 0.5); await imageEncoder.FlushAsync(); providerRequest.SetData(RandomAccessStreamReference.CreateFromStream(inMemoryStream)); } finally { deferral.Complete(); } } }
// 用户点击了分享目标后会调用此方法 private async void OnDeferredImageRequestedHandler(DataProviderRequest providerRequest, StorageFile imageFile) { // 获取 DataProviderDeferral,以开始异步处理 DataProviderDeferral deferral = providerRequest.GetDeferral(); InMemoryRandomAccessStream inMemoryStream = new InMemoryRandomAccessStream(); try { // 将用户选中的图片缩小一倍,然后再分享 IRandomAccessStream imageStream = await imageFile.OpenAsync(FileAccessMode.Read); BitmapDecoder imageDecoder = await BitmapDecoder.CreateAsync(imageStream); BitmapEncoder imageEncoder = await BitmapEncoder.CreateForTranscodingAsync(inMemoryStream, imageDecoder); imageEncoder.BitmapTransform.ScaledWidth = (uint)(imageDecoder.OrientedPixelWidth * 0.5); imageEncoder.BitmapTransform.ScaledHeight = (uint)(imageDecoder.OrientedPixelHeight * 0.5); await imageEncoder.FlushAsync(); // 停 3 秒,以模拟长时间任务 await Task.Delay(3000); providerRequest.SetData(RandomAccessStreamReference.CreateFromStream(inMemoryStream)); } finally { // 完成异步操作 deferral.Complete(); } }
private async void ProvideData(DataProviderRequest request) { DataProviderDeferral deferral = request.GetDeferral(); var stream = new InMemoryRandomAccessStream(); await Graph.SaveImageAsync(stream); request.SetData(RandomAccessStreamReference.CreateFromStream(stream)); deferral.Complete(); }
//<SnippetShareFileFunction_CS> //<SnippetShareFileFunction> async void OnDeferredImageRequestedHandler(DataProviderRequest request) { // Here we provide updated Bitmap data using delayed rendering if (this.imageStream != null) { //<SnippetGetDefferal_CS> //<SnippetGetDefferal> DataProviderDeferral deferral = request.GetDeferral(); //</SnippetGetDefferal> //</SnippetGetDefferal_CS> 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(); } } }
// <SnippetShareFileFunction_CS> async void OnDeferredImageRequestedHandler(DataProviderRequest request) { // Provide updated bitmap data using delayed rendering. if (this.imageStream != null) { DataProviderDeferral deferral = request.GetDeferral(); 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)); deferral.Complete(); } }
private void OnDeferredImageRequestedHandler(DataProviderRequest request) { if (_url != null) { // If the delegate is calling any asynchronous operations it needs to acquire // the deferral first. This lets the system know that you are performing some // operations that might take a little longer and that the call to SetData // could happen after the delegate returns. Once you acquired the deferral object // you must call Complete on it after your final call to SetData. DataProviderDeferral deferral = request.GetDeferral(); // Make sure to always call Complete when finished with the deferral. try { request.SetData(_url); } finally { deferral.Complete(); } } }
private async void OnDeferredImageRequestedHandler(DataProviderRequest request) { // Request deferral to wait for async calls DataProviderDeferral deferral = request.GetDeferral(); // XAML objects can only be accessed on the UI thread, and the call may come in on a background thread await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, async() => { try { RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap(); InMemoryRandomAccessStream stream = new InMemoryRandomAccessStream(); // Render to an image at the current system scale and retrieve pixel contents await renderTargetBitmap.RenderAsync(collageCanvas); var pixelBuffer = await renderTargetBitmap.GetPixelsAsync(); // Encode image to an in-memory stream var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, stream); encoder.SetPixelData( BitmapPixelFormat.Bgra8, BitmapAlphaMode.Ignore, (uint)renderTargetBitmap.PixelWidth, (uint)renderTargetBitmap.PixelHeight, DisplayInformation.GetForCurrentView().LogicalDpi, DisplayInformation.GetForCurrentView().LogicalDpi, pixelBuffer.ToArray()); await encoder.FlushAsync(); // Set content of the DataProviderRequest to the encoded image in memory request.SetData(RandomAccessStreamReference.CreateFromStream(stream)); } finally { deferral.Complete(); } }); }