如何在 DotNetBrowser 的新 tab/window/winform 中检测并打开 link

how to detect and open link in new tab/window/winform in DotNetBrowser

我使用 DotNetBrowser 并想在 new window/winform/tab 中打开 link 当点击 link 但是当我们点击在任何 link DotNetBrowser 中打开它们 window 我知道我应该覆盖 DotNetBrowser 事件但是我不知道哪个事件,我也尝试 CreatePopupHandler 但没有工作,我也找不到任何样本 DotNetBrowser 任何地方希望你们能帮助我。

CreatePopupHandler 处理程序 is invoked 当引擎想知道是否可以创建弹出窗口时。基本上,您可以使用它来允许或禁止创建弹出窗口。

如果 CreatePopupHandler 处理程序允许创建弹出窗口,则调用 OpenPopupHandler 处理程序。在此处理程序中,您可以访问创建的弹出窗口并在必要时显示它。

当您初始化 WinForms BrowserView 时,它会使用 CreatePopupHandlerOpenPopupHandler 处理程序的默认实现自动配置给定的 IBrowser 实例。

在这种情况下,在新的window(弹出窗口)中打开link时有两种情况:

  1. window.open()JavaScript函数:
window.open("https://www.google.com", "_blank", 
    "resizable=yes, top=500, left=500, width=400, height=400");
  1. 具有 target 属性的 link:
<a href="https://www.google.com" target="_blank">Open Google</a>

要在导航尝试的单独 window 或选项卡中加载任何 URL(例如单击 link),您需要使用 StartNavigationHandler。在handler实现中,需要新建一个window or tab with browser,将这个URL加载进去,在原来的浏览器中取消加载。例如:

browser.Navigation.StartNavigationHandler =
    new Handler<StartNavigationParameters, StartNavigationResponse>((p) =>
    {
        // Intercept all navigation requests to the URLs that start 
        // with "https://dotnetbrowser" and load them into a new form
        if (p.Url.StartsWith("https://dotnetbrowser"))
        {
            BeginInvoke((Action)(() => 
            {
                LoadNewWindow(p.Url);
            }));
            return StartNavigationResponse.Ignore();
        }
        return StartNavigationResponse.Start();
    });
browser?.Navigation.LoadUrl("https://teamdev.com/dotnetbrowser");

LoadNewWindow 实现:

private void LoadNewWindow(string url)
{
    var browser1 = engine.CreateBrowser();

    BrowserView browserView = new BrowserView
    {
        Dock = DockStyle.Fill
    };

    browserView.InitializeFrom(browser1);

    Form form = new Form();

    form.Width = 800;
    form.Height = 600;

    form.Closed += delegate
    {
        form.Controls.Clear();

        if (!browser1.IsDisposed)
        {
            browser1.Dispose();
        }
    };

    form.Controls.Add(browserView);
    form.Show();

    browser1.Navigation.LoadUrl(url);
}