首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c#与JS之间使用webview2的双向通信

c#与JS之间使用webview2的双向通信
EN

Stack Overflow用户
提问于 2022-02-17 08:49:16
回答 1查看 2K关注 0票数 2

我在winforms应用程序中使用webview2控件。我使用消息在c#和Javascript之间进行通信。

  • window.chrome.webview.addEventListener / window.chrome.webview.postMessage in Javascript
  • event .CoreWebView2.WebMessageReceived和方法CoreWebView2. C#

中的.CoreWebView2.WebMessageReceived

通信工作,但只有在webview2中的页面被刷新之后。c#发送的第一条消息总是被JS忽略/不接收。之后的消息被正确地接收和处理。

我的UI代码:

代码语言:javascript
复制
public GUI()
{
    InitializeComponent();
    browser.Source = new Uri(System.IO.Path.GetFullPath("HTML/ui.html"));
    InitializeAsync();
}
async void InitializeAsync()
{
    await browser.EnsureCoreWebView2Async(null);
    browser.CoreWebView2.WebMessageReceived += MessageReceived;
    }
void MessageReceived(object sender, CoreWebView2WebMessageReceivedEventArgs args)
{
    String content = args.TryGetWebMessageAsString();
    if (content.StartsWith("getData"))
    {
        ReadDataFromCATIA();
        var serializerSettings = new JsonSerializerSettings { PreserveReferencesHandling = PreserveReferencesHandling.Objects };
        string jsonRootNode = JsonConvert.SerializeObject(this.RootNode, Formatting.Indented, serializerSettings); //here I've got the message I want to post
        //String input = args.TryGetWebMessageAsString();
        //MessageBox.Show("string from JS: " + input);
        browser.CoreWebView2.PostWebMessageAsString(jsonRootNode);
    }
    else //object received
    {
        ProductNode received = JsonConvert.DeserializeObject<ProductNode>(content);
        MessageBox.Show(received.PartNumber + " received");
    }
}

和我在ui.html的JS

代码语言:javascript
复制
window.chrome.webview.addEventListener('message', event => {
    alert(event.data);
    WriteDataFromCsharp(event.data);
});
function WriteDataFromCsharp(data) {
    var target = document.getElementById('target');
    if (target === null) { alert('target not found') };
    //alert(target.id);
    //target.textContent = event.data;

    rootNode = JSON.parse(data);
    target.innerHTML = addTable(rootNode); //addTable create an HTML table from the deserialized object rootNode
}
function RequestData() {
    //function triggered by a button on the html page
    //alert('post to c#');
    window.chrome.webview.postMessage('getData');
}

到目前为止,我一直试图:

  • 确保javascript在页面中尽可能晚(延迟,在正文末尾)。不使用changes.
  • inject将javascript加载到使用.CoreWebView2.AddScriptToExecuteOnDocumentCreatedAsync(jsCode).加载的页面同样的behavior.
  • inject,事件NavigationCompleted触发后的javascript。同样的行为。

我错过了什么?

EN

回答 1

Stack Overflow用户

发布于 2022-02-17 13:12:52

终于找到了罪魁祸首:在我的HTML页面中,我使用了“提交”而不是“按钮”。使用

代码语言:javascript
复制
<input type="button" value="Load data from V5" onclick="RequestData()" />

页面行为与预期的相同。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71154923

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档