E.NewWindow=(CoreWebView2)发送者仍会生成单独的实例

人气:322 发布:2022-10-16 标签: c# winforms event-handling webview2

问题描述

我希望导航到该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,我需要做什么才能让它处理新的窗口请求?

推荐答案

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

当有生成弹出窗口的请求时会引发该事件。单击只会导致浏览器导航到其他URI的链接不会引发事件(没有弹出窗口)。 如果用户点击浏览器提供的标准上下文菜单的Open link in new window(原文如此)选项,则可以请求新的弹出窗口。 或者如果网页在没有用户干预的情况下生成了一个。

遗憾的是,e.IsUserInitiated属性始终为true,因此您可能很难(在不注入Java脚本的情况下)确定是否应该阻止弹出窗口(如果您想阻止的话)。

当请求新的弹出窗口时,您可以不加区别地设置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();
    }
}

588