0

WPF WebView2控件在里面MainWindow.xaml(如下所示)。从内部的按钮单击事件(代码如下所示)调用ExecuteScriptAsync(...)时,它工作正常。MainWindow.xaml.cs但是当WebView2从另一个类AnotherWindow.xaml.cs(在同一个项目中)访问控制并调用相同的ExecuteScriptAsync(...)方法时,它抱怨CoreWebView2为空

问题:我可能缺少什么,如何解决?

MainWindow.xaml

<Window x:Class="WpfWebView2TEST.MainWindow"
        .....
        xmlns:wv2="clr-namespace:Microsoft.Web.WebView2.Wpf;assembly=Microsoft.Web.WebView2.Wpf"
        mc:Ignorable="d"
        Style="{StaticResource CustomWindowStyle}"
        Title="MainWindow" Height="450" Width="800">
    
    <Grid>
        <Button x:Name="btnTest" Content=Test" Click="btnTest_Click"/>
        <wv2:WebView2 Name="webView" />
    </Grid>
</Window>

备注1:当按钮及其点击事件在里面时,以下工作正常MainWindow.xaml.cs

private async void btnTest1_Click(object sender, RoutedEventArgs e)
{
    await webView.CoreWebView2.ExecuteScriptAsync("window.print();");
}

下面的调试模式显示CoreWebView2不为空(因此代码有效):

在此处输入图像描述

备注2AnotherWindow.xaml.cs :当按钮及其点击事件在同一个项目的另一个窗口内但访问的WebView2控件时,以下不起作用MainWindow.xaml

private async void btnPrint_Click(object sender, RoutedEventArgs e)
{
    MainWindow mainWindow = new MainWindow();
    await mainWindow.webView.CoreWebView2.ExecuteScriptAsync("window.print();");
}

AnotherWindow.xaml.cs下面显示的调试模式CoreWebView2不为空(因此引发错误:未设置对象引用):

在此处输入图像描述

4

1 回答 1

1

您需要按照 WebView2 文档中的说明初始化 CoreWebView2

创建后,控件的 CoreWebView2 属性将为空。这是因为创建 CoreWebView2 是一项昂贵的操作,其中涉及启动 Edge 浏览器进程等事情。有两种方法可以创建 CoreWebView2: 1) 调用 EnsureCoreWebView2Async 方法。这称为显式初始化。2) 设置 Source 属性(例如,可以从标记中完成)。

从第二个问题来看,您不能使用 Source 属性来提供文档的 HTML。您需要调用 EnsureCoreWebView2Async,等待它完成,然后在 CoreWebView2 上调用 NavigateToString:

   await webView.EnsureCoreWebView2Async(null);
   webView.CoreWebView2.NavigateToString(htmlString);
于 2020-09-14T16:54:46.900 回答