c# - 使用 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>
解决方案
注释掉(或删除)以下行:
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();
}
推荐阅读
- sql - 'Unpivoting' 一个 SQL 表
- visual-studio-code - 在 VSCode 中切换/禁用实时 Markdown 预览更新?
- javascript - 标准化 javascript 对象数组中的键
- firebase - 所有 Firebase 云消息都带有 messageId 吗?
- react-native - 如何在反应导航自定义标签栏组件上调度操作
- python - 从 C# WASM 调用 IronPython
- linux - 当条件假设在单个主机上运行时,为什么 Ansible 在多个主机上运行?
- android - 在某些设备上使用应用程序时,应用程序的 UI 失真
- azure - 关于 Azure 应用服务中的快照功能
- java - 使用 ResponseEntity 从另一个 API 中提取信息