Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

707
Views
comunicación bidireccional entre c # y JS usando webview2

Estoy usando un control webview2 en una aplicación winforms. Uso mensajes para comunicarme entre C# y Javascript.

  • window.chrome.webview.addEventListener / window.chrome.webview.postMessage en Javascript
  • evento .CoreWebView2.WebMessageReceived y método CoreWebView2.PostWebMessageAsString en C#

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:

  • asegúrese de que el javascript esté lo más tarde posible en la página (diferir, al final del cuerpo). Sin cambios.
  • inyecta el javascript en la página después de que se haya cargado usando .CoreWebView2.AddScriptToExecuteOnDocumentCreatedAsync(jsCode). Mismo comportamiento.
  • inyecte el javascript después de que se haya activado el evento NavigationCompleted. mismo comportamiento.

¿Qué echo de menos?

about 4 years ago · Juan Pablo Isaza
1 answers
Answer question

0

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.

about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!