WebView2 (WPF):carica il sito Web dalla cartella locale e chiama la funzione C# e chiama la funzione JS

 C Programming >> Programmazione C >  >> Tags >> WPF
WebView2 (WPF):carica il sito Web dalla cartella locale e chiama la funzione C# e chiama la funzione JS

Soluzione per WebView2 (WPF):carica il sito Web dalla cartella locale e chiama la funzione C# e chiama la funzione JS
di seguito:

Sto facendo in modo che un'applicazione WPF utilizzi WebView2.

Ci sarà un programma di installazione che installerà l'applicazione WPF in una cartella e scaricherà e scriverà anche il sito Web in una sottocartella della directory di installazione. Come questo:

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

Il WebView2 caricherà il sito web usando questo (credo):webView.CoreWebView2.Navigate(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Website");

Questo dovrebbe caricare index.html e tutti i file a cui fa riferimento come index.css .

Ora la mia preoccupazione principale è come chiamo una funzione JavaScript da C#. Finora, dopo aver cercato su Google, ho trovato solo modi per WebView1. E non sono riuscito a trovare nulla sulla chiamata di un metodo C# da JavaScript.

Quindi tre cose:

  1. Questo è webView.CoreWebView2.Navigate(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Website"); corretto per il caricamento di un sito Web da una cartella locale?
  2. Come potrei chiamare una funzione JavaScript e passarle un oggetto C# da un metodo C#.
  3. Come potrei chiamare una funzione C# dallo script JavaScript?

È possibile?

Grazie.

Utilizzo dell'URI del file

Non sono sicuro se AppDomain.CurrentDomain.BaseDirectory ti porterà sempre il percorso corretto. Puoi usare qualcosa come il seguente:

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);

Devi includere il percorso dell'indice.html stesso e non solo la cartella contenente l'indice.html.

Normalmente Navigate dovrebbe prendere un URI, ma se invece fornisci un percorso di file di Windows lo convertirà in un URI di file per te e dovrebbe funzionare.

Gli URI di file presentano alcune limitazioni quando si tenta di incorporare URI http(s) e altre funzionalità della piattaforma Web che richiedono https.

Utilizzo di un URI HTTPS virtuale

Se riscontri problemi con gli URI dei file, puoi utilizzare CoreWebView2.SetVirtualHostNameToFolderMapping per mappare un percorso di file Windows su un nome 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");

Questo creerà un nome host falso "appassets.example" che verrà mappato al percorso del tuo file Windows. E poiché i suoi URI HTTPS non si verificano gli stessi problemi che si verificano con gli URI di file.

Ospita oggetti nello script

Per le tue domande 2 e 3 puoi usare CoreWebView2.AddHostObjectToScript. L'implementazione corrente di AddHostObjectToScript richiede che le classi C# siano contrassegnate in modo speciale. Puoi vederlo nella documentazione di AddHostObjectToScript.