使用 CoreWebView2NewWindowRequestedEventArgs 在子窗口中打开 URL

问题描述

在我的 WPF WebView2 控件中,我想从主窗口执行 window.open("https://www.google.com") 以使用 CoreWebView2_NewWindowRequested 在子窗口中打开 URL。但是 URL 网页没有显示在子窗口实例中。

我不太确定我下面的代码有什么问题:

MainWindow.xaml.cs

  private async void btnopenPopup_Click(object sender,RoutedEventArgs e)
  {
     await MainWebView2Instance.ExecuteScriptAsync("openPopup()");
  }

  private async void CoreWebView2_NewWindowRequested(object sender,CoreWebView2NewWindowRequestedEventArgs e)
  {
    Microsoft.Web.WebView2.Core.CoreWebView2Deferral deferral = e.GetDeferral();
    MainWindow childWindow = new MainWindow();
    childWindow.Title = "Child Window";

    //Creating a new webview2 instance for the child window
    WebView2 childWebView2Instance = new WebView2();
    await childWebView2Instance.EnsureCoreWebView2Async(null);

    childWebView2Instance.source = new Uri(e.Uri);

    childWindow.dockPanel.Children.Add(childWebView2Instance);

    e.Handled = true;
    deferral.Complete();
    childWindow.Show();
  }

HTML 页面中的 JavaScript

<script type="text/javascript">
   function openPopup() {
            window.open("https://www.google.com ");
        }
</script>

解决方法

注释掉(或删除)以下行:

await childWebView2Instance.EnsureCoreWebView2Async(null);

——它正在阻塞。您没有使用 CoreWebView2Environment,因此它的用法是不必要的。当您为 childWebView2Instance 设置 Source 属性时,它将隐式初始化 CoreWebView2。

更新:

当点击网页上的链接时,以下代码将打开一个子窗口,网页的 HTML 如下所示:

index.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<html>

<head>
</head>

<script>
  function popuponclick()
  {
     my_window = window.open("https://www.google.com");
  }

</script>

<body>

  <div>
    <a href="javascript: popuponclick()">Open Popup Window</A>
  </div>

</body>
</html>

MainWindow.xaml

         ...

<wv2:WebView2 
Name="webView21"
CoreWebView2InitializationCompleted="webView21_CoreWebView2InitializationCompleted" 
Source="http://127.0.0.1:80/index.html"/>

         ...

webView21_CoreWebView2InitializationCompleted (MainWindow.xaml.cs)

private void webView21_CoreWebView2InitializationCompleted(object sender,Microsoft.Web.WebView2.Core.CoreWebView2InitializationCompletedEventArgs e)
{
    System.Diagnostics.Debug.WriteLine(this.Title + " - webView21_CoreWebView2InitializationCompleted");
    webView21.CoreWebView2.NewWindowRequested += CoreWebView2_NewWindowRequested;
}

向 MainWindow.xaml.cs 添加 using 语句

using Microsoft.Web.WebView2.Core;
using Microsoft.Web.WebView2.Wpf;

MainWindow.xaml.cs 中,添加另一个可用于设置 WebView2 控件的 Source 属性的构造函数。它应该如下所示:

构造函数:(MainWindow.xaml.cs)

         ...

public MainWindow()
{
    InitializeComponent();
}

public MainWindow(string url)
{
    InitializeComponent();

    webView21.Source = new Uri(url);
}

         ...

CoreWebView2_NewWindowRequested (MainWindow.xaml.cs)

private void CoreWebView2_NewWindowRequested(object sender,Microsoft.Web.WebView2.Core.CoreWebView2NewWindowRequestedEventArgs e)
{
    CoreWebView2 cwv2 = (CoreWebView2)sender;

    Microsoft.Web.WebView2.Core.CoreWebView2Deferral deferral = e.GetDeferral();

    MainWindow childWindow = null;
    childWindow = new MainWindow(e.Uri);
    childWindow.Title = "Child Window";
    childWindow.Show();

    e.Handled = true;
    deferral.Complete();
}