Estoy usando un control webview2 en una aplicación winforms. Uso mensajes para comunicarme entre C# y Javascript.
La comunicación funciona PERO solo después de que la página en webview2 se haya actualizado de alguna manera. JS siempre ignora/no recibe el primer mensaje enviado por C#. Los mensajes posteriores se reciben y procesan correctamente.
Mi código de interfaz de usuario:
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"); } }y mi JS en ui.html
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'); }Hasta ahora, he intentado:
¿Qué echo de menos?
Finalmente encontré al culpable: en mi página HTML, he usado un "enviar" en lugar de un "botón". Con
<input type="button" value="Load data from V5" onclick="RequestData()" />El comportamiento de la página es el esperado.