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

标签 .net webview webbrowser-control 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>
窗口.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 版更简单,更通用。它使用 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等等。
使用示例(来自问题):
private async void btnCallDocument_Click(object sender, RoutedEventArgs e)
{
    await webBrowser.ExecuteScriptFunctionAsync("WriteMessageFromWPF", this.txtMessageFromWPF.Text);
}
另一个例子 (这会将窗口滚动到底部):
await webView21.ExecuteScriptFunctionAsync("window.scrollTo", 0, 10000);

关于.net - 相当于 WebView2 中的 WebBrowser.InvokeScript(String, Object[]),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62835549/

相关文章:

c# - 在非静态类中锁定静态变量是否安全?

c# - InvalidOperationException 未处理 - WPF 路径

c# - CompositeWPF 是否支持多个窗口/外壳?

android - 使用自定义上下文操作栏进行 WebView 文本选择

c# - .NET 的 OLE 容器

c# - Windows 窗体 Web 浏览器控制缩放级别

c# - 如何从用属性修饰的 C# 类生成 .proto 文件?

java - android webview显示空白页面

java - 在 javafx 应用程序中使用 HTML5 视频标签

C# WebBrowser 禁用和隐藏滚动条