gpt4 book ai didi

c# - e.NewWindow = (CoreWebView2)sender 仍然会产生单独的实例

转载 作者:行者123 更新时间:2023-12-02 18:35:55 34 4
gpt4 key购买 nike

我想导航到该 URL,而不是打开一个单独的实例。
无论我做什么,它仍然会打开 WebView2 的另一个实例。

private void CoreWebView2_NewWindowRequested(object sender,
CoreWebView2NewWindowRequestedEventArgs e)
{
//e.NewWindow = webView21.CoreWebView2;
e.NewWindow = (CoreWebView2)sender;
//e.Handled = true;
}

here's the original post ,我需要做什么才能让它处理新窗口请求?

最佳答案

要在请求新的弹出窗口时收到通知,请订阅NewWindowRequested CoreWebView2 的。

当请求生成弹出窗口时,会引发该事件。单击仅导致浏览器导航到不同 URI 的链接不会引发该事件(无弹出窗口)。
如果用户单击浏览器提供的标准上下文菜单的在新窗口中打开链接(原文如此)选项,则可以请求新的弹出窗口。
或者,如果网页在没有用户干预的情况下生成网页。

不幸的是,e.IsUserInitiated属性始终为 true,因此您可能很难确定(在不注入(inject) 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();
}
}

如果您想创建一个将显示弹出窗口的新表单,则需要一个接收 CoreWebView2Deferral 的表单模板(它可以只是包含 WebView2 控件的表单)。返回者 e.GetDeferral() .

在该Form的初始化过程中检查CoreWebView2Deferral对象是否为null。如果不是,请通过调用其 Complete() 来完成延迟事件。方法。

然后订阅 NewWindowRequested 事件,以便在请求新的弹出窗口时执行相同的操作(除非您想阻止它)。

当然,您可以在选项卡式控件中显示这些表单,以生成在所有 Web 浏览器中常见的标准选项卡式 View 。

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

关于c# - e.NewWindow = (CoreWebView2)sender 仍然会产生单独的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68782495/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com