WebView2 (WPF):cargue el sitio web desde la carpeta local y llame a la función C # y llame a la función JS

 C Programming >> Programación C >  >> Tags >> WPF
WebView2 (WPF):cargue el sitio web desde la carpeta local y llame a la función C # y llame a la función JS

Solución para WebView2 (WPF):cargue el sitio web desde la carpeta local y llame a la función C# y llame a la función JS
a continuación:

Estoy haciendo que una aplicación WPF use WebView2.

Habrá un instalador que instalará la aplicación WPF en una carpeta y también descargará y escribirá el sitio web en una subcarpeta del directorio de instalación. Como esto:

Installation Directory
├───Website
│   ├───index.css
│   └───index.html
└───WPF Self Contained EXE

WebView2 cargará el sitio web usando esto (creo):webView.CoreWebView2.Navigate(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Website");

Esto debería cargar index.html y todos los archivos a los que hace referencia, como index.css .

Ahora mi principal preocupación es cómo llamo a una función de JavaScript desde C#. Hasta ahora, después de buscar en Google, solo he encontrado formas para WebView1. Y no pude encontrar nada acerca de llamar a un método C# desde JavaScript.

Así que tres cosas:

  1. Es este webView.CoreWebView2.Navigate(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Website"); correcto para cargar un sitio web desde una carpeta local?
  2. ¿Cómo llamaría a una función de JavaScript y le pasaría un objeto de C# desde un método de C#?
  3. ¿Cómo llamaría a una función de C# desde el script de JavaScript?

¿Es esto posible?

Gracias.

Uso del URI del archivo

No estoy seguro de si AppDomain.CurrentDomain.BaseDirectory siempre le dará la ruta correcta. Puedes usar algo como lo siguiente:

string exePath = System.Reflection.Assembly.GetExecutingAssembly().Location;
string exeFolder = System.IO.Path.GetDirectoryName(exePath);
string websiteFolder = Path.Combine(exeFolder, "website");
string htmlPath = Path.Combine(websiteFolder, "index.html");

webView.CoreWebView2.Navigate(htmlPath);

Debe incluir la ruta al propio index.html y no solo la carpeta que contiene el index.html.

Normalmente, Navigate debe tomar un URI, pero si proporciona una ruta de archivo de Windows, lo convertirá en un URI de archivo y debería funcionar.

Los URI de archivo tienen algunas limitaciones al intentar incorporar URI de http(s) y otras características de la plataforma web que requieren https.

Uso de un URI HTTPS virtual

Si tiene problemas al usar URI de archivos, puede usar CoreWebView2.SetVirtualHostNameToFolderMapping para asignar una ruta de archivo de Windows a un nombre de host HTTPS falso:

string exePath = System.Reflection.Assembly.GetExecutingAssembly().Location;
string exeFolder = System.IO.Path.GetDirectoryName(exePath);
string websiteFolder = Path.Combine(exeFolder, "website");

webView.CoreWebView2.SetVirtualHostNameToFolderMapping("appassets.example", websiteFolder, CoreWebView2HostResourceAccessKind.DenyCors);
webView.CoreWebView2.Navigate("https://appassets.example/index.html");

Esto creará un nombre de host falso 'appassets.example' que se asignará a la ruta de su archivo de Windows. Y dado que se trata de URI de HTTPS, no se enfrenta a los mismos problemas que con los URI de archivo.

Alojar objetos en script

Para sus preguntas 2 y 3, puede usar CoreWebView2.AddHostObjectToScript. La implementación actual de AddHostObjectToScript requiere que sus clases de C# estén especialmente marcadas. Puede verlo en la documentación de AddHostObjectToScript.