概述

UWP Community Toolkit Extensions 中有一个为 WebView 提供的扩展 - WebViewExtensions,本篇我们结合代码详细讲解 WebView Extensions 的实现。

WebView Extensions 允许使用附加属性,在 XAML 中指定 WebView 的目标地址或目标网页内容,关于这一扩展,官方示例应用中并没有对应示例,我们实现一个简单的示例截图:

Source: https://github.com/Microsoft/UWPCommunityToolkit/tree/master/Microsoft.Toolkit.Uwp.UI/Extensions/WebView

Doc: https://docs.microsoft.com/zh-cn/windows/uwpcommunitytoolkit/extensions/webviewextensions

Namespace: Microsoft.Toolkit.Uwp.UI.Extensions; Nuget: Microsoft.Toolkit.Uwp.UI;

开发过程

代码分析

我们先来看一下 WebViewExtensions 的类结构:

其中 Webview.cs 和 WebView.Properties.cs 类已被标记为 Obsolete,被 WebViewExtensions.cs 替代。

WebViewExtensions.cs

首先来看类中定义的几个附加属性:

  • Content - WebView 的目标网页内容,类型为 string,变化时触发 OnContentChanged 事件;
  • ContentUri - WebView 的目标网页地址,类型为 Uri,变化时触发 OnContentUriChanged 事件;

接下来看看这两个事件的处理逻辑:

1. OnContentChanged(d, e)

这个方法很简单,就是读取变化后的 string,使用 WebView 的 NavigateToString 方法赋值;需要注意的是,这里的 content 并不一定是一个有效的 html 网页,也可以是一段普通的字符串,Webview 也会以默认的字体样式来显示这段字符串;

private static void OnContentChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    Windows.UI.Xaml.Controls.WebView wv = d as Windows.UI.Xaml.Controls.WebView;

    var content = e.NewValue as string;

    if (string.IsNullOrEmpty(content))
    {
        return;
    }

    wv?.NavigateToString(content);
}

2. OnContentUriChanged(d, e)

这个方法的实现也很简单,读取并把内容转为 Uri 类型,如果有效则跳转到对应的 Uri 网站;这里要求传入的值一定是格式正确的网址,虽然不一定是可用的网址,不然会造成 crash;

private static void OnContentUriChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    Windows.UI.Xaml.Controls.WebView wv = d as Windows.UI.Xaml.Controls.WebView;

    var uri = e.NewValue as Uri;

    if (uri == null)
    {
        return;
    }

    wv?.Navigate(uri);
}

调用示例

我们让 Webview 绑定 TextBlock 的 Text 作为 ContentUri,可以看到 WebView 正确跳转到了指定网址;

<TextBlock Text="http://www.cnblogs.com/shaomeng/" x:Name="uri"/>
<WebView Grid.Row="1" extensions:WebView.ContentUri="{Binding Text, ElementName=uri}"/>

总结

到这里我们就把 UWP Community Toolkit Extensions 中的 WebViewExtensions 的源代码实现过程和简单的调用示例讲解完成了,希望能对大家更好的理解和使用这个扩展有所帮助。欢迎大家多多交流,谢谢!

最后,再跟大家安利一下 UWPCommunityToolkit 的官方微博:https://weibo.com/u/6506046490大家可以通过微博关注最新动态。

衷心感谢 UWPCommunityToolkit 的作者们杰出的工作,Thank you so much, UWPCommunityToolkit authors!!!

Extensions in UWP Community Toolkit - WebViewExtensions的更多相关文章

  1. Extensions in UWP Community Toolkit - Overview

    概述 UWP Community Toolkit  中有一个 Extensions 的集合,它们可以帮助开发者实现很多基础功能,省去自己造轮子的过程,本篇我们先来看一下 Extensions 的功能都 ...

  2. Extensions in UWP Community Toolkit - FrameworkElement Extensions

    概述 UWP Community Toolkit Extensions 中有一个为FrameworkElement 提供的扩展 - FrameworkElement Extensions,本篇我们结合 ...

  3. Extensions in UWP Community Toolkit - Mouse Cursor

    概述 UWP Community Toolkit Extensions 中有一个为 Mouse 提供的扩展 - Mouse Cursor Extensions,本篇我们结合代码详细讲解 Mouse C ...

  4. Extensions in UWP Community Toolkit - SurfaceDialTextbox

    概述 UWP Community Toolkit Extensions 中有一个为TextBox 提供的 SurfaceDial 扩展 - SurfaceDialTextbox,本篇我们结合代码详细讲 ...

  5. Extensions in UWP Community Toolkit - ViewExtensions

    概述 UWP Community Toolkit Extensions 中有一个为 View 提供的扩展 - View Extensions,本篇我们结合代码详细讲解 View Extensions  ...

  6. Extensions in UWP Community Toolkit - Visual Extensions

    概述 UWP Community Toolkit Extensions 中有一个为可视元素提供的扩展 - VisualExtensions,本篇我们结合代码详细讲解 VisualExtensions ...

  7. Extensions in UWP Community Toolkit - ListViewExtensions

    概述 UWP Community Toolkit Extensions 中有一个为 ListView 提供的扩展 - ListViewExtensions,本篇我们结合代码详细讲解 ListView  ...

  8. New UWP Community Toolkit

    概述 UWP Community Toolkit 是一个 UWP App 自定义控件.应用服务和帮助方法的集合,能够很大程度的简化和指引开发者的开发工作,相信广大 UWPer 并不陌生. 下面是截取自 ...

  9. Animations in UWP Community Toolkit - Overview

    概述 UWP Community Toolkit  中有一个 Animations 的集合,它们可以帮助开发者实现很多的动画,本篇我们先来看一下 Animations 的功能都有哪些,再后面会针对每一 ...

随机推荐

  1. 【Docker】 积累

    ■ 磁盘空间和docker资源之间的关系 通过docker info | grep Space可以看到Docker占据的磁盘空间的信息.其中Data Space Used表示实际上docker资源占用 ...

  2. 【Java】 重拾Java入门

    [概论与基本语法] 取这个标题,还是感觉有些大言不惭.之前大三的时候自学过一些基本的java知识,大概到了能独立写一个GUI出来的水平把,不过后来随着有了其他目标,就把这块放下了.之后常年没有用,早就 ...

  3. diy51单片机最小系统------从零件到51整体测试成功小白篇

    前言 因为现在网上资料很多,但是很多博主水平不一样,有很多时候,自己在网上找了很多资料,因为自己智商不够,有时候感觉很多关键性的东西没说清楚,导致解决不了问题.那现在就从一个小白的角度来记录自己做过的 ...

  4. Kali Linux下安装Nessus扫描器

    一.官网下载Nessus(http://www.tenable.com/products/nessus/select-your-operating-system),这里需要查找自己对应的版本,如下图一 ...

  5. 使用Java编译思想

    1.Java常见的注释有哪些,语法是怎样的? 1)单行注释用//表示,编译器看到//会忽略该行//后的所文本 2)多行注释/* */表示,编译器看到/*时会搜索接下来的*/,忽略掉/* */之间的文本 ...

  6. linux小白成长之路7————Docker安装mysql

    [内容指引] 从Docker检索mysql镜像: Mysql Docker镜像下载: 查看本地镜像列表: 设置Mysql的Docker镜像开机自动运行: 常用Docker指令及参数: 1.从Docke ...

  7. Oracle修改字段类型方法小技巧

    有一个表名为tb,字段段名为name,数据类型nchar(20). 1.假设字段数据为空,则不管改为什么字段类型,可以直接执行:alter table tb modify (name nvarchar ...

  8. drbd(二):配置和使用

    本文目录:1.drbd配置文件2.创建metadata区并计算metadata区的大小3.启动drbd4.实现drbd主从同步5.数据同步和主从角色切换6.drbd脑裂后的解决办法7.drbd多卷组配 ...

  9. Win调整和小技巧

    推荐win下一些个人爱用的工具软件(以及使用心得)和一些系统调整方法,让win下不尽人意的设置发生小小变化,让整天摸着电脑的ITer们的生活更有乐趣. 本人酷爱收集一些好用的软件,若各位也对某个或某些 ...

  10. c字符数组

    一.PTA实验作业 题目1:统计一行文本的单词个数 1. 本题PTA提交列表 2. 设计思路 定义一个长度为1000的字符数组str[1000] 在定义 i=0,cnt=0:cnt用来记录单词的个数 ...