相当于 WebView2 中的 WebBrowser.InvokeScript(String, Object[])

use*_*067 7 .net webbrowser-control webview webview2

在我的 WPF 应用程序中,我能够使用 WebBrowser 的 InvokeScript(String, Object[]) 方法成功地将消息从 WPF 传递到 JavaScript。我在 Object[] 参数中传递消息,并且 JS 代码很好地接受了它。(见下面的代码)

如何在 WebView2 中实现同样的效果?有什么方法可以像在WebBrowser控件中一样将参数传递给JS代码吗?

窗口.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>
Run Code Online (Sandbox Code Playgroud)

窗口.xaml.cs

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

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>
Run Code Online (Sandbox Code Playgroud)

Pou*_*Bak 10

更新:扩展的版本 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

将 javascript 函数名称作为第一个参数传递,然后是函数参数。

该代码使得可以拥有可序列化为 JSON 的任意数量的所有类型的参数:objectarraystringall numbersboolean

使用示例(来自问题):

private async void btnCallDocument_Click(object sender, RoutedEventArgs e)
{
    await webBrowser.ExecuteScriptFunctionAsync("WriteMessageFromWPF", this.txtMessageFromWPF.Text);
}
Run Code Online (Sandbox Code Playgroud)

另一个例子(这会将窗口滚动到底部):

await webView21.ExecuteScriptFunctionAsync("window.scrollTo", 0, 10000);
Run Code Online (Sandbox Code Playgroud)