You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从带AllowForWeb属性的WinRT组件C#代码触发WebView内JS自定义事件

从WinRT组件的C#代码触发WebView中JS自定义事件的实现方案

嘿,我明白你已经搞定了JS调用C#的反向流程,现在要实现从C#主动触发WebView里的JS自定义事件对吧?这其实可以通过宿主应用中转的方式来实现,因为WinRT组件本身不能直接操作WebView(出于架构隔离的设计),下面给你一步步拆解具体实现:

步骤1:修改WinRT组件,添加事件通知机制

首先在你的WebViewInjectionObject里新增一个事件,用来通知宿主应用“我要触发JS事件了”,同时提供触发这个事件的方法:

// 定义触发JS事件的委托
public delegate void TriggerJsCustomEventHandler(string eventName, string eventData);

[AllowForWeb]
public sealed class WebViewInjectionObject {
    // 你原来的反向流程代码(JS调用C#)
    public delegate void NotifyAppHandler(string str);
    public event NotifyAppHandler OnNotifyApp;
    public void NotifyApp(string str) {
        OnNotifyApp?.Invoke(str);
    }

    // 新增:通知宿主触发JS自定义事件的事件
    public event TriggerJsCustomEventHandler OnTriggerJsCustomEvent;

    // 组件内部调用这个方法,即可发起JS事件触发请求
    public void TriggerJsCustomEvent(string eventName, string eventData) {
        OnTriggerJsCustomEvent?.Invoke(eventName, eventData);
    }
}

步骤2:在宿主应用中绑定事件并执行JS代码

在你的UWP宿主应用里,把WinRT组件注入WebView后,订阅组件的OnTriggerJsCustomEvent事件,当事件触发时,调用WebView的ExecuteScriptAsync方法执行JS代码来触发自定义事件:

// 假设你的WebView控件名为MyWebView
var injectionObj = new WebViewInjectionObject();
// 将对象注入WebView,供JS调用(原来的逻辑保留)
MyWebView.AddWebAllowedObject("webViewInjection", injectionObj);

// 订阅组件的事件,处理JS触发请求
injectionObj.OnTriggerJsCustomEvent += async (eventName, eventData) => {
    // 注意:如果eventData包含特殊字符(比如引号、换行),一定要做转义处理!
    // 这里用Json序列化来避免转义问题,需要引用Newtonsoft.Json NuGet包
    string serializedData = Newtonsoft.Json.JsonConvert.SerializeObject(eventData);
    
    // 构造触发自定义事件的JS代码
    string jsCode = $"const customEvent = new CustomEvent('{eventName}', {{ detail: {serializedData} }}); window.dispatchEvent(customEvent);";
    
    // 执行JS代码
    await MyWebView.ExecuteScriptAsync(jsCode);
};

步骤3:在WebView的JS代码中监听自定义事件

最后在WebView加载的HTML/JS里,监听你要触发的自定义事件即可:

// 监听名为myCustomEvent的自定义事件
window.addEventListener('myCustomEvent', function(e) {
    console.log('收到C#触发的事件:', e.detail);
    // 这里写你的事件处理逻辑
});

怎么在WinRT组件里触发?

当你的WinRT组件的C#代码需要触发JS事件时,只需要调用TriggerJsCustomEvent方法就行:

// 比如在组件的某个业务逻辑完成后
TriggerJsCustomEvent("myCustomEvent", "这是来自C#的事件数据");

这样整个流程就通了:WinRT组件触发事件 → 宿主应用接收并调用WebView执行JS → JS监听并处理事件。

内容的提问来源于stack exchange,提问作者Corcus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:45:42