Обновление : 2-я версия расширения намного проще и универсальнее. Он использует JSON как 'промежуточную станцию' - используйте NewtonSoft или встроенный JSON конвертер.
Вот расширение , которое я сделал (просто создайте файл класса и вставьте это).
ExecuteScriptFunctionAsync
строит строку, необходимую для ExecuteScriptAsync
, а затем выполняет ее:
//using Microsoft.Web.WebView2.WinForms; //Uncomment the one you use
//using Microsoft.Web.WebView2.Wpf; //Uncomment the one you use
using Newtonsoft.Json;
using System.Threading.Tasks;
public static class Extensions
{
public static async Task<string> ExecuteScriptFunctionAsync(this WebView2 webView2, string functionName, params object[] parameters)
{
string script = functionName + "(";
for (int i = 0; i < parameters.Length; i++)
{
script += JsonConvert.SerializeObject(parameters[i]);
if (i < parameters.Length - 1)
{
script += ", ";
}
}
script += ");";
return await webView2.ExecuteScriptAsync(script);
}
}
Передайте имя функции javascript в качестве первого параметра, а затем функцию параметры.
Код позволяет иметь любое количество параметров всех типов, которые могут быть сериализованы в JSON: object
, array
, string
, all numbers
, boolean
et c.
Пример использования (из вопроса):
private async void btnCallDocument_Click(object sender, RoutedEventArgs e)
{
await webBrowser.ExecuteScriptFunctionAsync("WriteMessageFromWPF", this.txtMessageFromWPF.Text);
}
Другой пример (это приведет к прокрутке окна до внизу):
await webView21.ExecuteScriptFunctionAsync("window.scrollTo", 0, 10000);