Эквивалент WebBrowser.InvokeScript (String, Object []) в WebView2 - PullRequest
1 голос
/ 10 июля 2020

Заранее спасибо.

В моем приложении WPF я успешно могу передать сообщение из WPF в JavaScript с помощью метода InvokeScript (String, Object []) WebBrowser. Я передаю свое сообщение в параметре Object [], и оно хорошо принимается кодом JS. (См. Код ниже)

Как я могу добиться того же в WebView2? Есть ли способ передать параметры в код JS точно так же, как мы это делаем в элементе управления WebBrowser?

Window.xaml

 <Grid>
            <DockPanel> 
                <StackPanel>        
                <TextBox x:Name="txtMessageFromWPF" Width="150" FontSize="20"></TextBox>
                <Button x:Name="btnCallDocument" Click="btnCallDocument_Click" Content="CallDocument" />
                </StackPanel>
                <WebBrowser x:Name="webBrowser" DockPanel.Dock="Top" Margin="30"/>           
            </DockPanel>
        </Grid>

Window.xaml.cs

        private void btnCallDocument_Click(object sender, RoutedEventArgs e)
        {
            webBrowser.InvokeScript("WriteMessageFromWPF", new object[] { this.txtMessageFromWPF.Text });
        }

JS Код:

 <script type="text/javascript">
            function getAlert()
            {
                alert("Hi the page is loaded!!!");
            }
            window.onload = getAlert;
            
            function WriteMessageFromWPF(message){
                document.write("Message from WPF: " + message);
            }
        </script>

Ответы [ 2 ]

1 голос
/ 10 июля 2020

Обновление : 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);
1 голос
/ 10 июля 2020

В настоящее время нет прямого эквивалента InvokeScript в WebView2. Ближайшим является CoreWebView2.ExecuteScriptAsyn c. Этот метод принимает строку сценария для запуска и асинхронно возвращает результат выполнения сценария в виде строки JSON.

Если вы хотите вызвать функцию, вам нужно будет создать строку сценария для этого и передайте его ExecuteScriptAsyn c. В вашем примере это означает создание строки WriteMessageFromWPF("...") и предоставление ее для ExecuteScriptAsyn c.

Сложная часть правильно кодирует ваш параметр функции. Если в строковом параметре есть кавычка, вам нужно будет использовать sla sh для экранирования кавычек или создать неверный сценарий. Вы должны иметь возможность убрать sh кавычки с помощью String.Replace:

string script = "WriteMessageFromWPF(\"" + 
    this.txtMessageFromWPF.Text.Replace("\"", "\\\"")
    + "\")";
await webview2.CoreWebView2.ExecuteScriptAsync(script);
...