首页 > 解决方案 > 使用 CoreWebView2NewWindowRequestedEventArgs 在子窗口中打开 URL

问题描述

在我的 WPF WebView2 控件中,我想window.open("https://www.google.com")从主窗口执行以使用CoreWebView2_NewWindowRequested. 但是 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>

标签: c#.netwpfchromiumwebview2

解决方案


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

await childWebView2Instance.EnsureCoreWebView2Async(null);

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

更新:

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

索引.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>

主窗口.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;
}

将 using 语句添加到 MainWindow.xaml.cs

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();
}

推荐阅读