c# - e.NewWindow = (CoreWebView2)sender 仍然会产生一个单独的实例
问题描述
我想导航到 URL,而不是打开一个单独的实例。
无论我做什么,它仍然会打开另一个 WebView2 实例。
private void CoreWebView2_NewWindowRequested(object sender,
CoreWebView2NewWindowRequestedEventArgs e)
{
//e.NewWindow = webView21.CoreWebView2;
e.NewWindow = (CoreWebView2)sender;
//e.Handled = true;
}
这是原始帖子,我需要做什么才能处理新窗口请求?
解决方案
要在请求新的弹出窗口时接收通知,请订阅 CoreWebView2 的NewWindowRequested。
当有生成弹出窗口的请求时引发该事件。单击只会导致浏览器导航到不同 URI 的链接不会引发事件(无弹出窗口)。 如果用户单击浏览器提供的标准 ContextMenu
的 (sic) 选项,则可以请求新的弹出窗口。
或者,如果网页在没有用户干预的情况下生成一个。Open link in new window
不幸的是,e.IsUserInitiated属性始终为true
,因此您可能很难确定(不注入 JavaScript)是否应该阻止弹出窗口(如果您愿意的话)。
当请求一个新的弹出窗口时,您可以随意设置e.Handled = true
.
如果要打开同一个窗口的新窗口 URI,可以指定:
e.Handled = true;
e.NewWindow = (CoreWebView2)sender;
// or
e.Handled = true;
((CoreWebView2)sender).Navigate(e.Uri);
示例 WebView2 主处理程序表单:
using Microsoft.Web.WebView2.Core;
public partial class MainForm : Form
{
public MainForm() => InitializeComponent();
protected override async void OnLoad(EventArgs e)
{
base.OnLoad(e);
webView2.CoreWebView2InitializationCompleted += OnCoreWebView2InitializationCompleted;
var env = await CoreWebView2Environment.CreateAsync(null, null, null);
await webView2.EnsureCoreWebView2Async(env);
webView2.Source = new Uri("https://www.somesite.com");
}
private void OnCoreWebView2InitializationCompleted(object sender, CoreWebView2InitializationCompletedEventArgs e)
{
webView2.CoreWebView2.NewWindowRequested += OnNewWindowRequested;
}
private void OnNewWindowRequested(object sender, CoreWebView2NewWindowRequestedEventArgs e)
{
// Open the Uri requested in the current Window
e.Handled = true;
((CoreWebView2)sender).Navigate(e.Uri);
}
// Or, if you want to handle Popup Windows using your own Form template
// => Note that it's the same event handler as above, pick one, not both!
private void OnNewWindowRequested(object sender, CoreWebView2NewWindowRequestedEventArgs e)
{
// Open the Uri requested in a new instance of the PopupWindow Form
var deferral = e.GetDeferral();
e.Handled = true;
var popup = new PopupWindow(deferral, e);
popup.Show();
}
}
如果您想创建一个将显示弹出窗口的新表单,则需要一个接收e.GetDeferral ()返回的CoreWebView2Deferral的表单模板(它可以只是一个包含 WebView2 控件的表单)。
在这个表单的初始化过程中检查CoreWebView2Deferral
对象是否为空。如果不是,则通过调用其Complete()方法来完成延迟事件。
然后订阅该NewWindowRequested
事件以在请求新的弹出窗口时执行相同的操作(除非您想阻止它)。
当然,您可以在选项卡式控件中显示这些表单,以生成标准的选项卡式视图,这在所有 Web 浏览器中都很常见。
样本PopupWindow
表格:
using Microsoft.Web.WebView2.Core;
using System.Windows.Forms;
public partial class PopupWindow : Form
{
public PopupWindow() => InitializeComponent();
public PopupWindow(CoreWebView2Deferral deferral, CoreWebView2NewWindowRequestedEventArgs args)
: this() {
Core2Deferral = deferral;
NewWindowArgs = args;
}
protected virtual CoreWebView2Deferral Core2Deferral { get; private set; }
protected virtual CoreWebView2NewWindowRequestedEventArgs NewWindowArgs { get; private set; }
protected async override void OnLoad(EventArgs e)
{
base.OnLoad(e);
webView2.CoreWebView2InitializationCompleted += OnCoreWebView2InitializationCompleted;
var env = await CoreWebView2Environment.CreateAsync(null, null, null);
await webView2.EnsureCoreWebView2Async(env);
}
private void OnCoreWebView2InitializationCompleted(object sender, CoreWebView2InitializationCompletedEventArgs e)
{
webView2.CoreWebView2.Settings.AreDefaultContextMenusEnabled = true;
if (Core2Deferral != null) {
NewWindowArgs.NewWindow = webView2.CoreWebView2;
Core2Deferral.Complete();
}
webView2.CoreWebView2.NewWindowRequested += OnNewWindowRequested;
}
private void OnNewWindowRequested(object sender, CoreWebView2NewWindowRequestedEventArgs e)
{
e.Handled = true;
var popup = new PopupWindow(e.GetDeferral(), e);
popup.Show();
}
}
推荐阅读
- php - 跟踪来自 LinkedIn 的访问
- batch-file - 批处理文件 系统找不到指定的路径
- javascript - 如何在jQuery中页面加载后替换图像src
- python - 使用克莱默法则求矩阵的逆
- android - 如何一次获取 2 个 json 对象?
- python - 在 Django Graphene Relay 中启用基于 PK 的过滤,同时保留全局 ID
- python - 如何计算折线与 3D 曲面的交点?
- javascript - TypeError:从 API 而不是存根数据读取数据时,无法读取未定义的属性“forEach”
- dart - 如何在 ListView 中正确嵌套 ListView.builder?
- javascript - 如何基于另一个键值向数组中的对象添加新的键值对