背水一战 Windows 10 之 控件(WebView): 对 WebView 中的内容截图, 通过 Share Contract 分享 WebView 中的被选中的内容
[源码下载]
背水一战 Windows 10 (65) - 控件(WebView): 对 WebView 中的内容截图, 通过 Share Contract 分享 WebView 中的被选中的内容
作者:webabcd介绍背水一战 Windows 10 之 控件(WebView)
对 WebView 中的内容截图
通过 Share Contract 分享 WebView 中的被选中的内容
示例1、演示如何对 WebView 中的内容截图Controls/WebViewDemo/WebViewDemo5.xaml
x:Class="Windows10.Controls.WebViewDemo.WebViewDemo5" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:Windows10.Controls.WebViewDemo" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d">
Controls/WebViewDemo/WebViewDemo5.xaml.cs
/*
* WebView - 内嵌浏览器控件(继承自 FrameworkElement, 请参见 /Controls/BaseControl/FrameworkElementDemo/)
* CapturePreviewToStreamAsync() - 对 WebView 当前显示的内容截图,并将图片写入指定的流
*
*
* 本例用于演示如何对 WebView 中的内容截图
*/
using System;
using System.Runtime.InteropServices.WindowsRuntime;
using System.Threading.Tasks;
using Windows.Graphics.Imaging;
using Windows.Storage.Streams;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Media.Imaging;
namespace Windows10.Controls.WebViewDemo
{
public sealed partial class WebViewDemo5 : Page
{
public WebViewDemo5()
{
this.InitializeComponent();
}
private async void btnCapture_Click(object sender, RoutedEventArgs e)
{
// 对 WebView 中的内容截图,并将原始图像数据放入内存流
InMemoryRandomAccessStream ms = new InMemoryRandomAccessStream();
await webView.CapturePreviewToStreamAsync(ms);
// 显示原始截图
BitmapImage bitmapImage = new BitmapImage();
bitmapImage.SetSource(ms);
imageOriginal.Source = bitmapImage;
// 定义缩略图的大小(最长边定义为 180)
int longlength = 180, width = 0, height = 0;
double srcwidth = webView.ActualWidth, srcheight = webView.ActualHeight;
double factor = srcwidth / srcheight;
if (factor < 1)
{
height = longlength;
width = (int)(longlength * factor);
}
else
{
width = longlength;
height = (int)(longlength / factor);
}
// 显示原始截图的缩略图
BitmapSource thumbnail = await resize(width, height, ms);
imageThumbnail.Source = thumbnail;
}
// 将指定的图片修改为指定的大小,并返回修改后的图片
private async Task
{
WriteableBitmap thumbnail = new WriteableBitmap(width, height);
BitmapDecoder decoder = await BitmapDecoder.CreateAsync(source);
BitmapTransform transform = new BitmapTransform();
transform.ScaledHeight = (uint)height;
transform.ScaledWidth = (uint)width;
PixelDataProvider pixelData = await decoder.GetPixelDataAsync(
BitmapPixelFormat.Bgra8,
BitmapAlphaMode.Straight,
transform,
ExifOrientationMode.RespectExifOrientation,
ColorManagementMode.DoNotColorManage);
pixelData.DetachPixelData().CopyTo(thumbnail.PixelBuffer);
return thumbnail;
}
}
}
2、演示如何通过 Share Contract 分享 WebView 中的被选中的内容Controls/WebViewDemo/WebViewDemo6.xaml
x:Class="Windows10.Controls.WebViewDemo.WebViewDemo6" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:Windows10.Controls.WebViewDemo" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d">
Controls/WebViewDemo/WebViewDemo6.xaml.cs
/*
* WebView - 内嵌浏览器控件(继承自 FrameworkElement, 请参见 /Controls/BaseControl/FrameworkElementDemo/)
* CaptureSelectedContentToDataPackageAsync() - 将选中的内容转换为 DataPackage 对象
* DataRequested - 分享操作开始时触发的事件(事件参数 DataRequestedEventArgs)
*
* DataRequestedEventArgs
* GetDeferral() - 获取异步操作对象,同时开始异步操作,之后通过 Complete() 通知完成异步操作
*
*
* 本例用于演示如何通过 Share Contract 分享 WebView 中的被选中的内容(如果没有选中任何内容,则分享网页地址)
*/
using System;
using Windows.ApplicationModel.DataTransfer;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
namespace Windows10.Controls.WebViewDemo
{
public sealed partial class WebViewDemo6 : Page
{
private DataTransferManager _dataTransferManager;
public WebViewDemo6()
{
this.InitializeComponent();
}
private void btnShare_Click(object sender, RoutedEventArgs e)
{
_dataTransferManager = DataTransferManager.GetForCurrentView();
_dataTransferManager.DataRequested += _dataTransferManager_DataRequested;
DataTransferManager.ShowShareUI();
}
// 分享 WebView 中的被选中的内容
async void _dataTransferManager_DataRequested(DataTransferManager sender, DataRequestedEventArgs args)
{
DataRequest request = args.Request;
DataRequestDeferral deferral = args.Request.GetDeferral();
// 如果 dataPackage 是 null 的话,则说明用户没有选择任何内容
DataPackage dataPackage = await webView.CaptureSelectedContentToDataPackageAsync();
// 用于判断用户是否选中了分享内容
bool hasSelection = false;
try
{
hasSelection = (dataPackage != null) && (dataPackage.GetView().AvailableFormats.Count > 0);
}
catch (Exception ex)
{
switch (ex.HResult)
{
// 无法为选中的内容生成 data package
case unchecked((int)0x80070490):
hasSelection = false;
break;
default:
throw;
}
}
if (hasSelection)
{
dataPackage.Properties.Title = "Title(hasSelection)";
}
else
{
// 用户没有选择任何内容的话,则分享网页地址
dataPackage = new DataPackage();
dataPackage.SetWebLink(webView.Source);
dataPackage.Properties.Title = "Title";
}
dataPackage.Properties.Description = "Description";
request.Data = dataPackage;
_dataTransferManager.DataRequested -= _dataTransferManager_DataRequested;
deferral.Complete();
}
}
}
OK[源码下载]
发表评论