当前位置: 首页 > news >正文

WPF 、WebView2 、WebView2 、CoreWebView2 、HostObject 是什么?它们之间有什么关系?

WPF 窗口

这是你的桌面程序的顶层界面容器(Window)。它像一块画布,你把按钮、文本框、WebView2 等控件放到里面显示给用户。
没有窗口的句柄(HWND)时,很多底层控件创建不了,所以通常会在窗口显示/控件加载后再做初始化。

WebView2(WPF 控件)

这是一个可以嵌入浏览器的可视控件,来自 Microsoft.Web.WebView2.Wpf.WebView2。
它负责“显示”网页,是你拖到窗口里的那块区域(UI 层)。
但它本身不包含浏览器内核,必须先调用 EnsureCoreWebView2Async 创建并连接到真正的浏览器内核。

CoreWebView2(浏览器内核实例)

这是 WebView2 控件背后真正的浏览器对象,来自 Microsoft.Web.WebView2.Core.CoreWebView2。
当 EnsureCoreWebView2Async 完成后,webView2.CoreWebView2 才会变为可用。你通过它来:

  • 导航网页:CoreWebView2.Navigate(url)
  • 执行脚本:CoreWebView2.ExecuteScriptAsync(“…”)
  • 订阅事件:NavigationCompleted、NewWindowRequested、DocumentTitleChanged 等注入
  • HostObject:CoreWebView2.AddHostObjectToScript(…)

简单理解:WebView2 是“窗户”,CoreWebView2 是“窗外的世界”(浏览器内核),所有交互都在 CoreWebView2 上发生。

HostObject(宿主对象)

它是把你的 .NET/C# 对象“映射”进网页的 JavaScript 环境的桥梁。
你调用 AddHostObjectToScript(“名字”, 对象) 后,网页里就能通过 chrome.webview.hostObjects.名字 调用到你的 C# 方法/属性。
例如:

C#:webView2.CoreWebView2.AddHostObjectToScript("app", new AppBridge());
JS:await chrome.webview.hostObjects.app.DoSomething("参数");

每个 CoreWebView2 都是独立的运行时,新建窗口(新的 CoreWebView2)需要重新 AddHostObjectToScript,否则新窗口里的 JS看不到你的宿主对象。
安全建议:优先用 AddHostObjectToScriptWithOrigins 限定允许访问的来源;或者用 PostWebMessage/MessageReceived 做 JSON 消息通信,更好控权限。

它们之间的关系和生命周期

先有窗口(WPF Window)→ 放入 WebView2 控件 → 调用 EnsureCoreWebView2Async → 生成并拿到 CoreWebView2 → 在 CoreWebView2 上做导航、事件、HostObject 等。

WebView2 控件是一个 UI 包装器;CoreWebView2 是真正的浏览器实例。
新开一个窗口(比如页面 window.open)时,你通常会:

  1. 创建第二个 WebView2(新的控件)
  2. 对它再次 EnsureCoreWebView2Async(生成第二个 CoreWebView2)
  3. 给第二个 CoreWebView2 再注入 HostObject
  4. 用 ee.NewWindow 把新页面绑定到这个新的 CoreWebView2 上

【一个小例子把它串起来】

  1. 创建和初始化:
var win = new Window();
var web = new WebView2();
win.Content = web;
win.Show(); // 有句柄后再初始化
await web.EnsureCoreWebView2Async(env); // 初始化浏览器内核
  1. 使用 CoreWebView2:
web.CoreWebView2.Navigate("https://example.com");
web.CoreWebView2.DocumentTitleChanged += ...;
web.CoreWebView2.AddHostObjectToScript("app", new AppBridge());
  1. 处理新窗口:
web.CoreWebView2.NewWindowRequested += async (s, e) => {var def = e.GetDeferral(); e.Handled = true; var win2 = new Window(); var web2 = new WebView2(); win2.Content = web2; win2.Show(); await web2.EnsureCoreWebView2Async(env);web2.CoreWebView2.AddHostObjectToScript("app", new AppBridge()); e.NewWindow = web2.CoreWebView2; def.Complete(); };
http://www.dtcms.com/a/601955.html

相关文章:

  • 大连最好的做网站的公司wordpress国产网校
  • C语言编译器 | 如何高效使用和优化C语言编译器
  • C语言指针深度剖析(2):从“数组名陷阱”到“二级指针操控”的进阶指南
  • 中企动力做网站 知乎网站后台系统是用什么做的
  • Linux内核信号传递机制完全解析:从force_sig_info到kick_process的完整路径
  • 佛山新网站建设哪家好建筑方案设计流程步骤
  • 计算机工作原理
  • 北京做网站建设比较好的公司上海网站建设企业名录
  • AEC-Q100 stress实验详解#3——HTSL(高温储存寿命测试)
  • 洋洋点建站wordpress判断是否登录
  • 做的好的农产品网站怎样开通微商城平台
  • Python | 变量如何定义,数据类型介绍
  • 12. 2 雅可比法
  • 【OpenCV + VS】图像通道的均值和方差计算
  • (5)框架搭建:Qt实战项目之主窗体菜单栏
  • 网页C语言在线编译 | 快速、便捷的编程体验
  • 网站免费注册建站培训班
  • WebSpoon9.0(KETTLE的WEB版本)编译 + tomcatdocker部署 + 远程调试教程
  • 万网的网站建设好吗北京模板网站建站
  • Leaflet入门,Leaflet如何修复瓦片之间有白线问题
  • Unity一分钟思路---UI任务条:宝箱位置如何准确卡在百分比位置上
  • 在线做爰a视频网站个人网站搭建详细步骤
  • 网站开发 工作量云台山旅游景区网站建设内容
  • Android 使用MediaMuxer+MediaCodec编码MP4视频异步方案
  • 第14章 智能指针
  • GSV6128E/ACP---嵌入式Display port 1.4到 LVDS转换器,带音频提取和嵌入式MCU
  • 网站建设ftp上传是空目录仿做网站的网站
  • c 网站开发代码辅助色网站
  • 无法下载依赖:pentaho-aggdesigner-algorithm/5.1.5-jhyde
  • sward实战教程系列(1) - 安装与配置