Skip to content

caidc/MyWebView2Demo

Repository files navigation

MyWebView2Demo

Microsoft Edge WebView2简介

C#调用js代码

C#发送message(文本或者json数据)消息给js页面

采用PostWebMessageAsString()函数发送文本

private void button1_Click(object sender, EventArgs e)
{
    webView21.CoreWebView2.PostWebMessageAsString(textBox1.Text);
}

web页面采用window.chrome.webview.addEventListener('message', handle)接受消息

window.chrome.webview.addEventListener('message',function (event) {
  document.getElementById("msg").innerText = event.data;
});

注:其实AsString也可以发送json数据,C#中将其序列化为字符串,然后前端解析该字符串(参考:)

////多个值用json序列化传递,前端用js反序列化解析获取
public class WeatherForecast
{
    public DateTimeOffset Date { get; set; }
    public int TemperatureCelsius { get; set; }
    public string Summary { get; set; }
}
private void button2_Click(object sender, EventArgs e)
{
        var weatherForecast = new WeatherForecast
        {
            Date = DateTime.Parse("2019-08-01"),
            TemperatureCelsius = 25,
            Summary = "Hot"
        };
    //这里才用到System.Text.Json;
    string jsonString = JsonSerializer.Serialize(weatherForecast);
    webView21.CoreWebView2.PostWebMessageAsString(jsonString);
}
//接收json
window.chrome.webview.addEventListener("message", function(event) {
  const json = event.data;
  console.log(json);
  const obj = JSON.parse(json);
  // alert(123);
  console.log(obj);
  var count = Object.keys(obj).length;
  console.log(count);
  console.log(obj.Date);
  console.log(obj.TemperatureCelsius);
  console.log(obj.Summary);
} );

采用PostWebMessageAsJSON()函数发送json数据

C#代码里先把json数据序列化,然后前端可以直接读取到json数据

////多个值用json序列化传递,前端用js反序列化解析获取
public class WeatherForecast
{
    public DateTimeOffset Date { get; set; }
    public int TemperatureCelsius { get; set; }
    public string Summary { get; set; }
}
private void button3_Click(object sender, EventArgs e)
{
    var weatherForecast = new WeatherForecast
    {
        Date = DateTime.Parse("2019-08-01"),
        TemperatureCelsius = 25,
        Summary = "Hot"
    };
    //这里才用到Newtonsoft.Json;
    string jsonString = JsonConvert.SerializeObject(weatherForecast);
    webView21.CoreWebView2.PostWebMessageAsJson(jsonString);
}

web页面采用window.chrome.webview.addEventListener('message', handle)接受消息

//接收json
window.chrome.webview.addEventListener("message", function(event) {
    const json = event.data;
    console.log(json);
} );

C#中向web页面植入并执行js代码块或函数

ExecuteScriptAsync()

js_value参数就是字符串可以是单纯的字符串,也可以是反序列化后的json字符串。
webView21.CoreWebView2.ExecuteScriptAsync($"alert('收到C#要求执行的js函数,弹窗显示js_value:{js_value}')");
// 该函数供C#调用
function receiveMsgFromCSharp(msg) {
  console.log(msg);
  if(isJsonString(msg)){
    var obj=JSON.pares(msg)
  }
  document.getElementById("msg").innerText = msg;
}
// js判断字符串是否可转为json数据,如果可以则返回true
function isJsonString(str) {
  try {
    if (typeof JSON.parse(str) == "object") {
      return true;
    }
  } catch(e) {
  }
  return false;
}

js调用C#函数

步骤1

C#定义一个主机对象,如:CustomWebView2HostObject类,在类中编写方法并实现内部业务逻辑。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace MyWebView2Demo
{
    /// <summary>
    /// 自定义宿主类,用于向网页注册C#对象,供JS调用
    /// </summary>
    [ClassInterface(ClassInterfaceType.AutoDual)]
    [ComVisible(true)]
    public class CustomWebView2HostObject
    {
        public string TestCalcAddByCsharpMethod(int num1, int num2, string message)
        {
            MessageBox.Show($"C#方法接收到J传入的参数 num1={num1},num2={num2},message={message}", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            return "计算结果为:" + (num1 + num2);
        }
    }
}

自定义的 CustomWebView2HostObject 类,必须标记 [ClassInterface(ClassInterfaceType.AutoDual)]、[ComVisible(true)] 特性,否则JS无法访问到该类

步骤2

在访问目标网页之前,通过webView2.CoreWebView2.AddHostObjectToScript()方法向网页中注入主机对象,其中第一个参数是自定义名称(随意命名),JS中访问主机对象时就需要与该参数名称一致。

async void InitializeAsync()
{
    await webView21.EnsureCoreWebView2Async(null);
    // 接收来自web页面的消息
    webView21.CoreWebView2.WebMessageReceived += UpdateAddressBar;
    // 注册该函数
    webView21.CoreWebView2.AddHostObjectToScript("customWebView2HostObject", new CustomWebView2HostObject());
}

步骤3

// 获取主机对象
var hostObject = window.chrome.webview.hostObjects.customWebView2HostObject;
// 通过主机对象调用C#方法
var result = await hostObject.TestCalcAddByCsharpMethod(12, 14, "加法计算");

点击事件中,第31行获取主机对象,customWebView2HostObject 与 C#中定义的名称需要完全相同。 使用主机对象调用C#方法,由于调用过程是异步的,所以需要使用 await,方法定义前需要加上 async。 以上三步完成后即实现了JS访问C#方法。

参考:

About

C# winform中使用WebVIew2,JS 与C#交互demo

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published