protected override bool GetShareContent(DataRequest request) { // Get the user's selection from the WebView. Since this is an asynchronous operation we need to acquire the deferral first. DataRequestDeferral deferral = request.GetDeferral(); // Make sure to always call Complete when done with the deferral. try { var requestDataOperation = ShareWebView.CaptureSelectedContentToDataPackageAsync(); requestDataOperation.Completed += (asyncInfo, status) => { DataPackage requestData = asyncInfo.GetResults(); if ((requestData != null) && (requestData.GetView().AvailableFormats.Count > 0)) { requestData.Properties.Title = "A web snippet for you"; requestData.Properties.Description = "HTML selection from a WebView control"; // The description is optional. requestData.Properties.ContentSourceApplicationLink = ApplicationLink; requestData.Properties.ContentSourceWebLink = new Uri("http://msdn.microsoft.com"); request.Data = requestData; deferral.Complete(); } else { // FailWithDisplayText calls Complete on the deferral. request.FailWithDisplayText("Make a selection in the WebView control and try again."); } }; } catch (Exception) { deferral.Complete(); } // At this point, we haven't populated the data package yet. It's done asynchronously above. return(false); }
public ShareHtml() { this.InitializeComponent(); ShareWebView.Navigate(new Uri("http://msdn.microsoft.com")); }
protected override async void OnNavigatedTo(NavigationEventArgs e) { // It is recommended to only retrieve the ShareOperation object in the activation handler, return as // quickly as possible, and retrieve all data from the share target asynchronously. this.shareOperation = (ShareOperation)e.Parameter; await Task.Factory.StartNew(async() => { // Retrieve the data package properties. this.sharedDataTitle = this.shareOperation.Data.Properties.Title; this.sharedDataDescription = this.shareOperation.Data.Properties.Description; this.sharedDataPackageFamilyName = this.shareOperation.Data.Properties.PackageFamilyName; this.sharedDataContentSourceWebLink = this.shareOperation.Data.Properties.ContentSourceWebLink; this.sharedDataContentSourceApplicationLink = this.shareOperation.Data.Properties.ContentSourceApplicationLink; this.sharedDataLogoBackgroundColor = this.shareOperation.Data.Properties.LogoBackgroundColor; this.sharedDataSquare30x30Logo = this.shareOperation.Data.Properties.Square30x30Logo; this.sharedThumbnailStreamRef = this.shareOperation.Data.Properties.Thumbnail; this.shareQuickLinkId = this.shareOperation.QuickLinkId; // Retrieve the data package content. // The GetWebLinkAsync(), GetTextAsync(), GetStorageItemsAsync(), etc. APIs will throw if there was an error retrieving the data from the source app. // In this sample, we just display the error. It is recommended that a share target app handles these in a way appropriate for that particular app. if (this.shareOperation.Data.Contains(StandardDataFormats.WebLink)) { try { this.sharedWebLink = await this.shareOperation.Data.GetWebLinkAsync(); } catch (Exception ex) { NotifyUserBackgroundThread("Failed GetWebLinkAsync - " + ex.Message, NotifyType.ErrorMessage); } } if (this.shareOperation.Data.Contains(StandardDataFormats.ApplicationLink)) { try { this.sharedApplicationLink = await this.shareOperation.Data.GetApplicationLinkAsync(); } catch (Exception ex) { NotifyUserBackgroundThread("Failed GetApplicationLinkAsync - " + ex.Message, NotifyType.ErrorMessage); } } if (this.shareOperation.Data.Contains(StandardDataFormats.Text)) { try { this.sharedText = await this.shareOperation.Data.GetTextAsync(); } catch (Exception ex) { NotifyUserBackgroundThread("Failed GetTextAsync - " + ex.Message, NotifyType.ErrorMessage); } } if (this.shareOperation.Data.Contains(StandardDataFormats.StorageItems)) { try { this.sharedStorageItems = await this.shareOperation.Data.GetStorageItemsAsync(); } catch (Exception ex) { NotifyUserBackgroundThread("Failed GetStorageItemsAsync - " + ex.Message, NotifyType.ErrorMessage); } } if (this.shareOperation.Data.Contains(dataFormatName)) { try { this.sharedCustomData = await this.shareOperation.Data.GetTextAsync(dataFormatName); } catch (Exception ex) { NotifyUserBackgroundThread("Failed GetTextAsync(" + dataFormatName + ") - " + ex.Message, NotifyType.ErrorMessage); } } if (this.shareOperation.Data.Contains(StandardDataFormats.Html)) { try { this.sharedHtmlFormat = await this.shareOperation.Data.GetHtmlFormatAsync(); } catch (Exception ex) { NotifyUserBackgroundThread("Failed GetHtmlFormatAsync - " + ex.Message, NotifyType.ErrorMessage); } try { this.sharedResourceMap = await this.shareOperation.Data.GetResourceMapAsync(); } catch (Exception ex) { NotifyUserBackgroundThread("Failed GetResourceMapAsync - " + ex.Message, NotifyType.ErrorMessage); } } if (this.shareOperation.Data.Contains(StandardDataFormats.Bitmap)) { try { this.sharedBitmapStreamRef = await this.shareOperation.Data.GetBitmapAsync(); } catch (Exception ex) { NotifyUserBackgroundThread("Failed GetBitmapAsync - " + ex.Message, NotifyType.ErrorMessage); } } // In this sample, we just display the shared data content. // Get back to the UI thread using the dispatcher. await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async() => { DataPackageTitle.Text = this.sharedDataTitle; DataPackageDescription.Text = this.sharedDataDescription; DataPackagePackageFamilyName.Text = this.sharedDataPackageFamilyName; if (this.sharedDataContentSourceWebLink != null) { DataPackageContentSourceWebLink.Text = this.sharedDataContentSourceWebLink.AbsoluteUri; } if (this.sharedDataContentSourceApplicationLink != null) { DataPackageContentSourceApplicationLink.Text = this.sharedDataContentSourceApplicationLink.AbsoluteUri; } if (this.sharedDataSquare30x30Logo != null) { IRandomAccessStreamWithContentType logoStream = await this.sharedDataSquare30x30Logo.OpenReadAsync(); BitmapImage bitmapImage = new BitmapImage(); bitmapImage.SetSource(logoStream); LogoHolder.Source = bitmapImage; LogoBackground.Background = new SolidColorBrush(this.sharedDataLogoBackgroundColor); LogoArea.Visibility = Visibility.Visible; } if (!String.IsNullOrEmpty(this.shareOperation.QuickLinkId)) { SelectedQuickLinkId.Text = this.shareQuickLinkId; } if (this.sharedThumbnailStreamRef != null) { IRandomAccessStreamWithContentType thumbnailStream = await this.sharedThumbnailStreamRef.OpenReadAsync(); BitmapImage bitmapImage = new BitmapImage(); bitmapImage.SetSource(thumbnailStream); ThumbnailHolder.Source = bitmapImage; ThumbnailArea.Visibility = Visibility.Visible; } if (this.sharedWebLink != null) { AddContentValue("WebLink: ", this.sharedWebLink.AbsoluteUri); } if (this.sharedApplicationLink != null) { AddContentValue("ApplicationLink: ", this.sharedApplicationLink.AbsoluteUri); } if (this.sharedText != null) { AddContentValue("Text: ", this.sharedText); } if (this.sharedStorageItems != null) { // Display the name of the files being shared. StringBuilder fileNames = new StringBuilder(); for (int index = 0; index < this.sharedStorageItems.Count; index++) { fileNames.Append(this.sharedStorageItems[index].Name); if (index < this.sharedStorageItems.Count - 1) { fileNames.Append(", "); } } fileNames.Append("."); AddContentValue("StorageItems: ", fileNames.ToString()); } if (this.sharedCustomData != null) { // This is an area to be especially careful parsing data from the source app to avoid buffer overruns. // This sample doesn't perform data validation but will catch any exceptions thrown. try { StringBuilder receivedStrings = new StringBuilder(); JsonObject customObject = JsonObject.Parse(this.sharedCustomData); if (customObject.ContainsKey("type")) { if (customObject["type"].GetString() == "http://schema.org/Book") { // This sample expects the custom format to be of type http://schema.org/Book receivedStrings.AppendLine("Type: " + customObject["type"].Stringify()); JsonObject properties = customObject["properties"].GetObject(); receivedStrings.AppendLine("Image: " + properties["image"].Stringify()); receivedStrings.AppendLine("Name: " + properties["name"].Stringify()); receivedStrings.AppendLine("Book Format: " + properties["bookFormat"].Stringify()); receivedStrings.AppendLine("Author: " + properties["author"].Stringify()); receivedStrings.AppendLine("Number of Pages: " + properties["numberOfPages"].Stringify()); receivedStrings.AppendLine("Publisher: " + properties["publisher"].Stringify()); receivedStrings.AppendLine("Date Published: " + properties["datePublished"].Stringify()); receivedStrings.AppendLine("In Language: " + properties["inLanguage"].Stringify()); receivedStrings.Append("ISBN: " + properties["isbn"].Stringify()); AddContentValue("Custom format data:" + Environment.NewLine, receivedStrings.ToString()); } else { NotifyUser("The custom format from the source app is not of type http://schema.org/Book", NotifyType.ErrorMessage); } } else { NotifyUser("The custom format from the source app doesn't contain a type", NotifyType.ErrorMessage); } } catch (Exception ex) { NotifyUser("Failed to parse the custom data - " + ex.Message, NotifyType.ErrorMessage); } } if (this.sharedHtmlFormat != null) { string htmlFragment = HtmlFormatHelper.GetStaticFragment(this.sharedHtmlFormat); if (!String.IsNullOrEmpty(htmlFragment)) { AddContentValue("HTML: "); ShareWebView.Visibility = Visibility.Visible; ShareWebView.NavigateToString("<html><body>" + htmlFragment + "</body></html>"); } else { NotifyUser("GetStaticFragment failed to parse the HTML from the source app", NotifyType.ErrorMessage); } // Check if there are any local images in the resource map. if (this.sharedResourceMap.Count > 0) { ResourceMapValue.Text = ""; foreach (KeyValuePair <string, RandomAccessStreamReference> item in this.sharedResourceMap) { ResourceMapValue.Text += "\nKey: " + item.Key; } ResourceMapArea.Visibility = Visibility.Visible; } } if (this.sharedBitmapStreamRef != null) { IRandomAccessStreamWithContentType bitmapStream = await this.sharedBitmapStreamRef.OpenReadAsync(); BitmapImage bitmapImage = new BitmapImage(); bitmapImage.SetSource(bitmapStream); ImageHolder.Source = bitmapImage; ImageArea.Visibility = Visibility.Visible; } }); }); }