MyException - 我的异常网
当前位置:我的异常网» Windows » 破釜沉舟 Windows 10 (66)

破釜沉舟 Windows 10 (66)

www.MyException.Cn  网友分享于:2013-10-19  浏览:0次
背水一战 Windows 10 (66)

[源码下载]


背水一战 Windows 10 (66) - 控件(WebView): 监听和处理 WebView 的事件



作者:webabcd


介绍
背水一战 Windows 10 之 控件(WebView)

  • 监听页面的进入全屏事件和退出全屏事件
  • 监听导航至不支持 uri 协议的事件
  • 监听导航至不支持类型的文件的事件
  • 监听用新窗口打开 uri 的事件
  • 监听获取特殊权限的事件



示例
1、演示如何监听 WebView 中的内容的进入全屏和退出全屏的事件,以及如何获知当前 WebView 中的内容是否处于全屏状态;如何监听 WebView 在尝试导航至不支持的协议的 uri 时触发的事件;如何监听 WebView 在尝试导航至不支持的类型的文件时触发的事件
Controls/WebViewDemo/demo5.html

<!DOCTYPE html>
<html>
<head>
</head>
<body>
    <b>i am demo5.html</b>
    <p>
        <video controls="controls" autoplay="autoplay">
            <source src="http://media.w3.org/2010/05/sintel/trailer.mp4" type="video/mp4" />
        </video>
    </p>
</body>
</html>

Controls/WebViewDemo/demo6.html

<!DOCTYPE html>
<html>
<head>
</head>
<body>
    <b>i am demo6.html</b>
    <p>
        <a href="mycustom://abc">自定义 Uri 协议</a>
    </p>
</body>
</html>

Controls/WebViewDemo/demo7.html

<!DOCTYPE html>
<html>
<head>
</head>
<body>
    <b>i am demo7.html</b>
    <p>
        <a href="https://www.apple.com/cn/iphone/business/docs/iOS_Security_Guide.pdf">打开 pdf 文件</a>
    </p>
</body>
</html>

Controls/WebViewDemo/WebViewDemo7.xaml

<Page
    x:Class="Windows10.Controls.WebViewDemo.WebViewDemo7"
    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">
        <Grid Margin="10 0 10 10">

            <WebView Name="webView1" Width="400" Height="300" Source="ms-appx-web:///Controls/WebViewDemo/demo5.html" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="5" />

            <WebView Name="webView2" Width="400" Height="300" Source="ms-appx-web:///Controls/WebViewDemo/demo6.html" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="420 5 5 5" />

            <WebView Name="webView3" Width="400" Height="300" Source="ms-appx-web:///Controls/WebViewDemo/demo7.html" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="5 320 5 5" />

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

Controls/WebViewDemo/WebViewDemo7.xaml.cs

/*
 * WebView - 内嵌浏览器控件(继承自 FrameworkElement, 请参见 /Controls/BaseControl/FrameworkElementDemo/)
 *     ContainsFullScreenElementChanged - WebView 中的内容进入全屏或退出全屏时触发的事件
 *     ContainsFullScreenElement - WebView 中的内容是否处于全屏状态
 *     UnsupportedUriSchemeIdentified - 在尝试导航至 WebView 不支持的协议的 uri 时触发的事件
 *     UnviewableContentIdentified - 在尝试导航至 WebView 不支持的类型的文件时触发的事件
 * 
 * 
 * 本例用于演示
 * 1、如何监听 WebView 中的内容的进入全屏和退出全屏的事件,以及如何获知当前 WebView 中的内容是否处于全屏状态
 * 2、如何监听 WebView 在尝试导航至不支持的协议的 uri 时触发的事件
 * 3、如何监听 WebView 在尝试导航至不支持的类型的文件时触发的事件
 */

using System;
using Windows.System;
using Windows.UI.Popups;
using Windows.UI.ViewManagement;
using Windows.UI.Xaml.Controls;

namespace Windows10.Controls.WebViewDemo
{
    public sealed partial class WebViewDemo7 : Page
    {
        public WebViewDemo7()
        {
            this.InitializeComponent();

            webView1.ContainsFullScreenElementChanged += WebView1_ContainsFullScreenElementChanged;
            webView2.UnsupportedUriSchemeIdentified += WebView2_UnsupportedUriSchemeIdentified;
            webView3.UnviewableContentIdentified += WebView3_UnviewableContentIdentified;
        }

        // WebView 中的内容进入全屏或退出全屏时触发的事件
        private void WebView1_ContainsFullScreenElementChanged(WebView sender, object args)
        {
            ApplicationView applicationView = ApplicationView.GetForCurrentView();

            // WebView 中的内容处于全屏状体
            if (sender.ContainsFullScreenElement)
            {
                // 将 app 设置为全屏模式
                applicationView.TryEnterFullScreenMode();
            }
            else
            {
                // 将 app 退出全屏模式
                applicationView.ExitFullScreenMode();
            }
        }

        // 在尝试导航至 WebView 不支持的协议的 uri 时触发的事件
        private async void WebView2_UnsupportedUriSchemeIdentified(WebView sender, WebViewUnsupportedUriSchemeIdentifiedEventArgs args)
        {
            // 交由我处理吧(否则的话系统会弹出对话框,以便跳转至支持此协议的其他 app 或者在商店搜索支持此协议的 app)
            args.Handled = true;

            // 尝试导航至的 uri
            Uri myUri = args.Uri;
            await new MessageDialog(myUri.ToString(), "自定义 uri").ShowAsync();
        }

        // 在尝试导航至 WebView 不支持的类型的文件时触发的事件
        private async void WebView3_UnviewableContentIdentified(WebView sender, WebViewUnviewableContentIdentifiedEventArgs args)
        {
            // 文件类型,本例中此值为 "application/pdf"
            string mediaType = args.MediaType;

            // 尝试导航至的 uri(本例中此值为 https://www.apple.com/cn/iphone/business/docs/iOS_Security_Guide.pdf
            Uri uri = args.Uri;

            // uri 的 referrer(本例中此值为 https://www.apple.com/cn/iphone/business/docs/iOS_Security_Guide.pdf 并不是 uri 的 referrer,为啥?)
            Uri referrer = args.Referrer;

            if (args.Uri.AbsolutePath.EndsWith(".pdf"))
            {
                // 通过 launcher 打开 pdf 文件
                if (await Launcher.LaunchUriAsync(args.Uri))
                {
                  
                }
                else
                {
                
                }
            }
        }
    }
}


2、演示如何监听 WebView 在尝试用新开窗口打开 uri 时触发的事件;如何监听 WebView 在尝试获取特殊权限时触发的事件,比如地理位置等
Controls/WebViewDemo/demo8.html

<!DOCTYPE html>
<html>
<head>
</head>
<body>
    <b>i am demo8.html</b>
    <p>
        <a href="https://www.baidu.com/" target="_blank">新开窗口打开 https://www.baidu.com/</a>
    </p>
</body>
</html>

Controls/WebViewDemo/demo9.html

<!DOCTYPE html>
<html>
<head>
</head>
<body>
    <b>i am demo9.html</b>

    <script type="text/javascript">

        if (navigator.geolocation)
        {
            navigator.geolocation.getCurrentPosition
            (
                function (p)
                {

                },
                function (e)
                {

                }
            );
        }

    </script>
</body>
</html>

Controls/WebViewDemo/WebViewDemo8.xaml

<Page
    x:Class="Windows10.Controls.WebViewDemo.WebViewDemo8"
    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">
        <Grid Margin="10 0 10 10">

            <WebView Name="webView1" Width="400" Height="300" Source="ms-appx-web:///Controls/WebViewDemo/demo8.html" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="5" />

            <WebView Name="webView2" Width="400" Height="300" Source="ms-appx-web:///Controls/WebViewDemo/demo9.html" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="420 5 5 5" />

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

Controls/WebViewDemo/WebViewDemo8.xaml.cs

/*
 * WebView - 内嵌浏览器控件(继承自 FrameworkElement, 请参见 /Controls/BaseControl/FrameworkElementDemo/)
 *     NewWindowRequested - 在尝试用新开窗口打开 uri 时触发的事件
 *     PermissionRequested - 在尝试获取特殊权限时触发的事件,比如地理位置等
 * 
 * 
 * 本例用于演示
 * 1、如何监听 WebView 在尝试用新开窗口打开 uri 时触发的事件
 * 2、如何监听 WebView 在尝试获取特殊权限时触发的事件,比如地理位置等
 */

using System;
using Windows.UI.Popups;
using Windows.UI.Xaml.Controls;

namespace Windows10.Controls.WebViewDemo
{
    public sealed partial class WebViewDemo8 : Page
    {
        public WebViewDemo8()
        {
            this.InitializeComponent();

            webView1.NewWindowRequested += WebView1_NewWindowRequested;
            webView2.PermissionRequested += WebView2_PermissionRequested;
        }

        // 在尝试用新开窗口打开 uri 时触发的事件
        private async void WebView1_NewWindowRequested(WebView sender, WebViewNewWindowRequestedEventArgs args)
        {
            // 交由我处理吧(否则的话系统会用浏览器打开)
            args.Handled = true;

            // 需要新开窗口的 uri(本例中此值为 https://www.baidu.com/
            Uri uri = args.Uri;

            // uri 的 referrer(本例中此值为 https://www.baidu.com/ 并不是 uri 的 referrer,为啥?)
            Uri referrer = args.Referrer;

            await new MessageDialog(uri.ToString(), "需要新开窗口的 uri").ShowAsync();
        }

        // 在尝试获取特殊权限时触发的事件,比如地理位置等
        private void WebView2_PermissionRequested(WebView sender, WebViewPermissionRequestedEventArgs args)
        {
            /*
             * WebViewPermissionRequest - 特殊权限请求对象
             *     PermissionType - 特殊权限类型
             *     WebViewPermissionState - 特殊权限请求的状态(Unknown, Defer, Allow, Deny)
             *     Uri - 请求特殊权限的 uri
             *     Allow() - 授予请求的权限
             *     Deny() - 拒绝请求的权限
             *     Defer() - 延迟决定是否授予
             */
            WebViewPermissionRequest permissionRequest = args.PermissionRequest;
        }
    }
}



OK
[源码下载]

文章评论

Google伦敦新总部 犹如星级庄园
Google伦敦新总部 犹如星级庄园
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
程序员和编码员之间的区别
程序员和编码员之间的区别
漫画:程序员的工作
漫画:程序员的工作
一个程序员的时间管理
一个程序员的时间管理
老程序员的下场
老程序员的下场
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
鲜为人知的编程真相
鲜为人知的编程真相
每天工作4小时的程序员
每天工作4小时的程序员
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
Java程序员必看电影
Java程序员必看电影
程序员的鄙视链
程序员的鄙视链
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
为什么程序员都是夜猫子
为什么程序员都是夜猫子
程序员应该关注的一些事儿
程序员应该关注的一些事儿
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
程序员必看的十大电影
程序员必看的十大电影
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
我是如何打败拖延症的
我是如何打败拖延症的
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
编程语言是女人
编程语言是女人
旅行,写作,编程
旅行,写作,编程
2013年美国开发者薪资调查报告
2013年美国开发者薪资调查报告
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
那些争议最大的编程观点
那些争议最大的编程观点
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
代码女神横空出世
代码女神横空出世
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
总结2014中国互联网十大段子
总结2014中国互联网十大段子
我的丈夫是个程序员
我的丈夫是个程序员
中美印日四国程序员比较
中美印日四国程序员比较
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
10个调试和排错的小建议
10个调试和排错的小建议
 程序员的样子
程序员的样子
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
那些性感的让人尖叫的程序员
那些性感的让人尖叫的程序员
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有