背水一戰 Windows 10 (65) - 控制項(WebView): 對 WebView 中的內容截圖, 通過 Share Contract 分享 WebView 中的被選中的內容

来源:http://www.cnblogs.com/webabcd/archive/2017/09/21/7566605.html
-Advertisement-
Play Games

背水一戰 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

<Page
    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">

    <Grid Background="Transparent">
        <StackPanel Margin="10 0 10 10">

            <Button Name="btnCapture" Content="對此 WebView 中的當前內容截圖" Click="btnCapture_Click" Margin="5" />

            <WebView Name="webView" Width="400" Height="300" Source="http://webabcd.cnblogs.com/" HorizontalAlignment="Left" Margin="5" />

            <StackPanel Margin="5" Orientation="Horizontal">
                <Image Name="imageOriginal" Width="400" Height="300" HorizontalAlignment="Left" />
                <Image Name="imageThumbnail" Width="400" Height="300" HorizontalAlignment="Left" Margin="10 0 0 0" />
            </StackPanel>

        </StackPanel>
    </Grid>
</Page>

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<BitmapSource> resize(int width, int height, IRandomAccessStream source)
        {
            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

<Page
    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">

    <Grid Background="Transparent">
        <StackPanel Margin="10 0 10 10">

            <Button Name="btnShare" Content="通過 Share Contract 分享 WebView 中的被選中的內容(如果沒有選中任何內容,則分享網頁地址)" Click="btnShare_Click" Margin="5" />

            <WebView Name="webView" Width="400" Height="300" Source="http://webabcd.cnblogs.com/" HorizontalAlignment="Left" Margin="5" />

        </StackPanel>
    </Grid>
</Page>

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
[源碼下載]


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 雙緩存打開方式: 1、在控制項中直接設置。 SetStyle(ControlStyles.DoubleBuffer, true); 2、在控制項外通過反射設置。 control.GetType().GetProperty("DoubleBuffered", System.Reflection.Bindi ...
  • 在查看很多有複雜的數據的表格時,為了能夠快速地找到所需要的數據組時,往往需要對該數據組進行分類,一個簡單快速的方法就是對數據組所在的單元格填充背景顏色,這樣就使得我們在閱讀文件時能夠直觀的看到數據分類,既美觀又實用。那對於開發者而言,我這裡提供一個簡單快速的方法,即用C#給單元格設置背景顏色。下麵是 ...
  • 1.複習字元串(1)字元串的不可變性(2)字元串的方法:1)Split() 分割 把字元串中不想要的內容分割掉 返回一個字元串類型的數組 可以添加StringSplitOption.RemoveEmptyEntries 把空格都去除了,但是前面需要放入一個字元數組類型例: 2)Substring() ...
  • XML——>treeciew ...
  • 回到目錄 對於Dapper是一個輕量級的數據訪問框架,而需要使用者去自己做SQL,它,只是一個數據訪問者! 對些,Dapper推出了Contrib擴展包,它可以友好的讓開發人員使用linq,而不需要寫SQL,但在使用時要註意,你的增,刪,改,單表查詢是可以用它的,但對於多表的join操作就不要用了, ...
  • 目前我用的vs2017的版本是15.3.5。生成解決方案有時會提示如下: 開始以為是許可權的問題,找到相應的目錄設置everyone許可權,再次生成還是不行。重啟VS試了下,還是不行。 最後無奈重啟下電腦,再重新生成,終於沒有這個問題了。 可是好景不長,改了代碼,再次重新生成,又出現了這個問題,都快被逼 ...
  • dynamic是Framework4.0的新特性,dynamic的出現讓C#具有了弱語言類型的特性,編譯器在編譯的時候,不再對類型進行檢查,不會報錯,但是運行時如果執行的是不存在的屬性或者方法,運行程式還是會拋出RuntimeBinderException異常。 var 與 dynamic 的區別 ...
  • 最近.NET Core升級到2.0後開始慢慢搗鼓的多了起來,但遇到了不少坑,所以特來記錄下。 第一個坑 條件編譯符 我們在編寫一些方法的時候通常會為Debug模式增加一些輸出日誌等以便我們檢查,也會為Release模式增加或修改一些特定的參數,但今天我在寫這些的時候就遇到了這個坑#if !DEBUG ...
一周排行
    -Advertisement-
    Play Games
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...