在 WebView2 控件中使用 JavaScript 根据需求自由扩展原生应用的能力。本文探讨如何在 WebView2 中使用 JavaScript,并列举如何使用高级 WebView2 特性和功能进行开发。

一、开始之前

本文假定你已经有过WebView2开发的经验。如果你未接触过WebView2,请先阅读本系列文章的前两篇 .NET桌面程序混合开发之一:Winform+H5,WebView2概览 和 .NET桌面程序混合开发之二:在原生WinFrom程序中使用WebView2

二、WebView2核心功能

以下两个函数助你将JavaScript植入你的应用中

API 描述
ExecuteScriptAsync 在WebView2中执行JavaScript脚本。可以从本系统文章的前两篇中了解更多信息。
OnDocumentCreatedAsync 当页面的DOM创建时执行。

三、场景1:运行指定脚本文件

这个场景中,将从WebView2访问一段指定的JavaScript脚本。

注意:尽管编写内联 JavaScript 对于 JavaScript  运行效率可能比较高效,但您会丢失 JavaScript 颜色主题和行格式,也使得在 Visual Studio 中编写大段代码变得困难。

为解决这个问题,先创建单独的JavaScript文件,再将对文件的引用传给函数 ExecuteScriptAsync 的参数。

  1. 在工程中新建一个.js文件,里面写好你想要运行的js代码。这里在工程中新建script.js文件。
  2. 将这个js文件转化为String对象,然后传给函数 ExecuteScriptAsync
    a. 把脚本文件转换为字符串对象
    string text = System.IO.File.ReadAllText(@"C:\PATH_TO_YOUR_FILE\script.js");

    b. 将以上代码复制到你的主窗体初始化函数中

  3. 通过ExecuteScriptAsync将脚本传递给页面
    await webView.CoreWebView2.ExecuteScriptAsync(text);

四、场景2:去掉页面拖拽功能

本部分探讨使用脚本去除WebView2控件中的页面的拖拽功能。
开始前,先看下当前控件所具备的拖拽功能。

  1. 任意创建一个.txt文件,比如,创建名为contoso.txt,写入任意文字。
  2. 运行之前系统文章中创建的程序。
  3. 把 contoso.txt 文件拖拽到程序的WebView2控件时,会自动打开一个新的窗口显示文件内容。

接下来,添加代码以移除WebView2控件自带的拖拽功能:

  1. 把以下代码拷贝到主窗体的初始化函数InitializeAsync()中:
await webView.CoreWebView2.ExecuteScriptAsync("window.addEventListener('dragover',function(e){e.preventDefault();},false);");

await webView.CoreWebView2.ExecuteScriptAsync("window.addEventListener('drop',function(e){" +
"e.preventDefault();" +
"console.log(e.dataTransfer);" +
"console.log(e.dataTransfer.files[0])" +
"}, false);");
  1. 运行工程
  2. 试着再次将contoso.txt拖入WebView2控件中,会发现已经不打开新窗体了。

五、场景3:禁用右键菜单

本部分将移除页面上默认的右建菜单。开始前,先看下在当前的页面上点右键的弹出菜单:

  1. 运行工程
  2. 在WebView2控件的任意地方点右键。在弹出的菜单中有各种默认的菜单项。

接着来添加代码移除右键弹出菜单功能。

  1. 将下面的代码复制粘贴到窗体初始化函数InitializeAsync()
await webView.CoreWebView2.ExecuteScriptAsync("window.addEventListener('contextmenu', window => {window.preventDefault();});");
  1. 再次运行,此时已无法点开右键了。
 
 

.NET桌面程序混合开发之三:WebView2与JS的深度应用的更多相关文章

  1. Hybrid小程序混合开发之路 - 数据交互

    HTML+CSS是历史悠久.超高自由度.控制精准.表现能力极强.编码简单.学习门槛超低.真跨平台的一种UI界面开发方式. 本文介绍的是微信小程序和H5混合开发的一种数据交互方式. 很多应用在原生界面中 ...

  2. .NET混合开发解决方案12 网页JS调用C#方法访问WinForm或WPF窗体

    系列目录     [已更新最新开发文章,点击查看详细] WebView2控件应用详解系列博客 .NET桌面程序集成Web网页开发的十种解决方案 .NET混合开发解决方案1 WebView2简介 .NE ...

  3. .NET混合开发解决方案15 WebView2控件集成到WinForm程序编译后的文件及结构说明

    系列目录     [已更新最新开发文章,点击查看详细] WebView2控件应用详解系列博客 .NET桌面程序集成Web网页开发的十种解决方案 .NET混合开发解决方案1 WebView2简介 .NE ...

  4. .NET混合开发解决方案13 自定义WebView2中的上下文菜单

    系列目录     [已更新最新开发文章,点击查看详细] WebView2控件应用详解系列博客 .NET桌面程序集成Web网页开发的十种解决方案 .NET混合开发解决方案1 WebView2简介 .NE ...

  5. .NET混合开发解决方案14 WebView2的基本身份验证

    系列目录     [已更新最新开发文章,点击查看详细] WebView2控件应用详解系列博客 .NET桌面程序集成Web网页开发的十种解决方案 .NET混合开发解决方案1 WebView2简介 .NE ...

  6. .NET混合开发解决方案16 管理WebView2的用户数据

    系列目录     [已更新最新开发文章,点击查看详细] WebView2控件应用详解系列博客 .NET桌面程序集成Web网页开发的十种解决方案 .NET混合开发解决方案1 WebView2简介 .NE ...

  7. .NET混合开发解决方案24 WebView2对比CefSharp的超强优势

    系列目录     [已更新最新开发文章,点击查看详细] WebView2控件应用详解系列博客 .NET桌面程序集成Web网页开发的十种解决方案 .NET混合开发解决方案1 WebView2简介 .NE ...

  8. [Hybrid App]--Android混合开发,Android、Js的交互

    AndroidJs通信 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !imp ...

  9. .NET混合开发解决方案7 WinForm程序中通过NuGet管理器引用集成WebView2控件

    系列目录     [已更新最新开发文章,点击查看详细] WebView2组件支持在WinForm.WPF.WinUI3.Win32应用程序中集成加载Web网页功能应用.本篇主要介绍如何在WinForm ...

  10. .NET混合开发解决方案8 WinForm程序中通过设置固定版本运行时的BrowserExecutableFolder属性集成WebView2控件

    系列目录     [已更新最新开发文章,点击查看详细] 在我的博客<.NET混合开发解决方案7 WinForm程序中通过NuGet管理器引用集成WebView2控件>中介绍了WinForm ...

随机推荐

  1. mysql 必知必会整理—sql 计算函数[六]

    前言 简单整理一下sql的计算函数. 正文 函数没有SQL的可移植性强 能运行在多个系统上的代码称为可移植的(portable).相对来说,多数SQL语句是可移植的,在SQL实现之间有差异时,这些差异 ...

  2. lowdb 在electron 使用中注意的问题

    前言 可能很多人都没有听说过这个lowdb,但是它的确存在,而且在electron 中用到还是挺多的. 如何在electron 的render 进程中是引用electron 模块. 我们知道一个问题, ...

  3. WPF开发随笔收录-获取程序专有内存

    分享一个C#获取程序当前所占用的内存大小的方法,实测跟任务管理器上的内存值一样 /// <summary> /// 性能计数器组件类 /// </summary> privat ...

  4. EasyNLP中文文图生成模型带你秒变艺术家

    简介: 我们在EasyNLP框架中集成了中文文图生成功能,同时开放了模型的Checkpoint. 导读 宣物莫大于言,存形莫善于画. --[晋]陆机 多模态数据(文本.图像.声音)是人类认识.理解和表 ...

  5. 一套 SQL 搞定数据仓库?Flink有了新尝试

    数据仓库是公司数据发展到一定规模后必然需要提供的一种基础服务,也是"数据智能"建设的基础环节.迅速获取数据反馈不仅有利于改善产品及用户体验,更有利于公司的科学决策,因此获取数据的实 ...

  6. 图像检索在高德地图POI数据生产中的应用

    ​简介: 高德通过自有海量的图像源,来保证现实世界的每一个新增的POI及时制作成数据.在较短时间间隔内(小于月度),同一个地方的POI 的变化量是很低的. ​ 作者 | 灵笼.怀迩 来源 | 阿里技术 ...

  7. 【CDS技术揭秘系列 总篇】阿里云的云定义存储来了

    ​简介: 全新发布的云定义存储 CDS 和传统的存储阵列.分布式存储.软件定义存储的区别在哪里?阿里云存储团队如何看待将来存储的发展趋势?本文邀请了 CDS 研发团队的核心技术负责人为大家揭开围绕着阿 ...

  8. [FAQ] PHPStorm None project files detection

    当你发现在 phpstorm 中编辑项目文件,却提示 None project files detection.. 并且左侧 Project 下面只有文件,没有项目目录了. 此时可以删除项目目录下的 ...

  9. dotnet Multi-platform App UI 多平台应用 UI 框架简介

    现在可以使用 .NET 构建一切应用.富有生产力的 .NET 是当前数百万的开发者选择这个平台的理由.在 .NET 5 微软统一了整个 .NET 平台,将 .NET Core 和 Mono 以及基于 ...

  10. 为何 WPF 对 vcruntime140 有引用

    通过阅读 WPF 官方开源仓库的代码和文档,可以了解到在进行独立发布的时候会在仓库里面带上 vcruntime140 的原因 在独立发布的时候,可以在仓库里面找到 vcruntime140.dll 这 ...