码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • .NET混合开发解决方案12 网页JS调用C#方法访问WinForm或WPF窗体


    系列目录     【已更新最新开发文章,点击查看详细】

    WebView2控件应用详解系列博客

    .NET桌面程序集成Web网页开发的十种解决方案 

    .NET混合开发解决方案1 WebView2简介

    .NET混合开发解决方案2 WebView2与Edge浏览器的区别

    .NET混合开发解决方案3 WebView2的进程模型

    .NET混合开发解决方案4 WebView2的线程模型

    .NET混合开发解决方案5 WebView2运行时与分发应用

    .NET混合开发解决方案6 检测是否已安装合适的WebView2运行时 

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

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

    .NET混合开发解决方案9 WebView2控件的导航事件

    .NET混合开发解决方案10 WebView2控件调用网页JS方法

    .NET混合开发解决方案11 网页JS调用C#方法

      在前一篇博客《.NET混合开发解决方案11 网页JS调用C#方法》中介绍了JS访问C#方法的简单实现方式。但是在企业级应用软件中业务需求可能更加复杂,如JS调用C#方法之后,需要访问宿主的窗体,设置窗体(WinForm、WPF、WinUI、Win32)中的控件等。

    下面通过一个Demo来讲解如何实现JS调用C#方法。

    业务场景:JS调用C#方法,传递三个参数,分别是num1、num2、message。C#接收到参数后,调用WinFrom窗体中定义的方法,将num1与num2作为参数传入,并将计算结果显示在窗体控件上。

    先看一下示例效果

    下面详细介绍其实现步骤。

    步骤1

    1、在Frm4JSCallWinForm窗体上添加一个label,用于显示计算结果,默认值为0,且颜色为黑色。

     2、Frm4JSCallWinForm窗体后台代码中添加如下逻辑方法

    步骤2

    在主机对象中定义 TestCallCSharpWinForm() 方法,该方法中访问 Frm4JSCallWinForm 窗体中的 SetResultFromWeb() 方法

    在普通的类中如访问一个窗体有两种方式

    第一种是使用窗体类来实例化一个对象

    Frm4JSCallWinForm form = new Frm4JSCallWinForm();

    第二种方式直接使用窗体已经实例化之后的对象。

    窗体已经运行,说明已经实例化了,如果采用第一种方式,那么新创建的对象与正在运行的窗体对象不是同一个对象,即使访问到窗体中定义的方法也无法更新当前窗体上的控件属性。所以必须采用第二种方式。

    CustomWebView2HostObject 类 与 窗体 Frm4JSCallWinForm 类是两个独立的类,CustomWebView2HostObject 类无法直接获取当前正在运行的Frm4JSCallWinForm 对象,我们知道一个类中的静态变量或属性可以通过类名称直接访问,这里通过一个巧妙的方式来实现,即在 Frm4JSCallWinForm窗体中定义一个公开的静态的 Frm4JSCallWinForm  对象,在构造函数中赋值为当前运行的对象值。

    此时在外部任何类中都可以通过 Frm4JSCallWinForm.Instance 访问到当前运行的窗体对象。

    步骤3

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

    步骤4

    网页中定义一个测试按钮,并设置点击事件

    点击事件中,第43行获取主机对象,customWebView2HostObject 与 C#中定义的名称需要完全相同。

    使用主机对象调用C#方法,由于调用过程是异步的,所以需要使用 await,方法定义前需要加上 async。

    以上四步完成后即实现了JS访问窗体方法。

    系列目录     【已更新最新开发文章,点击查看详细】
  • 相关阅读:
    C++编程案例讲解-基于结构体的控制台通讯录管理系统
    Qt 基本知识
    Java学习路线图
    性能测试VS负载测试VS压力测试
    【数据结构初阶(3)】双向带头结点循环链表
    鸿蒙极速入门(六)-加载请求状态管理-LoadState+观察者模式
    瀑布流布局之columns属性
    MyBatis-Plus之DML编程控制
    25.cuBLAS开发指南中文版--cuBLAS中的Level-2函数symv()
    怎么注册微信小程序、微信小程序注册流程说明
  • 原文地址:https://www.cnblogs.com/SavionZhang/p/16219303.html
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号