You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在WinForms C#中通过WebView2程序化将弹窗链接打开到新标签页

WebView2 弹窗链接在新标签页打开的实现问题

我在WebView2(记为wv1)内添加了TabControl,需求是:点击该WebView2中的弹窗链接时,在新标签页的新WebView2控件中打开该链接。具体场景为Tab2中的wv1点击“Try it”按钮后,弹窗链接需在新标签页的新WebView2中打开。

以下是我目前的代码:

namespace WindowsBrowserApplication
{
    public partial class WindowsWebView : Form
    {
        public WindowsWebView()
        {
            InitializeComponent();
        }

        private void WindowsWebView_Load(object sender, EventArgs e)
        {
            InitBrowser();
        }

        private async Task Initizated()
        {
            await WebView.EnsureCoreWebView2Async(null);
        }

        public async void InitBrowser()
        {
            await Initizated();
            WebView.CoreWebView2.Navigate("https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_win_open");
            WebView.CoreWebView2.NewWindowRequested += CoreWebView2_NewWindowRequested;
        }

        public async void InitBrowserTab()
        {
            await Initizated();
        }
        private void CoreWebView2_NewWindowRequested(object sender, CoreWebView2NewWindowRequestedEventArgs e)
        {
            e.Handled = true;

            InitBrowserTab();
            TabPage tpage = new TabPage();

            var web = new WebView2();
            tpage.Controls.Add(web);
            tabControl.TabPages.Add(tpage);
        }
    }
}

问题分析与修正代码

原代码存在几个关键问题:

  • Initizated方法仅初始化原窗体的WebView控件,新创建的WebView2未完成CoreWebView2初始化
  • 新WebView2未设置填充布局,无法显示内容
  • 未将弹窗请求的链接传递给新WebView2进行导航

修正后的完整代码:

namespace WindowsBrowserApplication
{
    public partial class WindowsWebView : Form
    {
        public WindowsWebView()
        {
            InitializeComponent();
        }

        private void WindowsWebView_Load(object sender, EventArgs e)
        {
            _ = InitBrowser(); // 使用_避免异步警告
        }

        // 初始化指定的WebView2控件
        private async Task InitializeWebView2(WebView2 webView)
        {
            await webView.EnsureCoreWebView2Async(null);
        }

        public async Task InitBrowser()
        {
            await InitializeWebView2(WebView);
            WebView.CoreWebView2.Navigate("https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_win_open");
            WebView.CoreWebView2.NewWindowRequested += CoreWebView2_NewWindowRequested;
        }

        private async void CoreWebView2_NewWindowRequested(object sender, CoreWebView2NewWindowRequestedEventArgs e)
        {
            e.Handled = true;
            // 创建新标签页和WebView2控件
            TabPage newTab = new TabPage("新页面");
            WebView2 newWebView = new WebView2();
            // 设置控件填充标签页
            newWebView.Dock = DockStyle.Fill;
            newTab.Controls.Add(newWebView);
            tabControl.TabPages.Add(newTab);

            // 初始化新WebView2并导航到弹窗链接
            await InitializeWebView2(newWebView);
            newWebView.CoreWebView2.Navigate(e.Uri);
        }
    }
}

关键修改说明

  1. 重构InitializeWebView2方法,接收指定的WebView2控件作为参数,实现通用初始化逻辑
  2. 新创建的WebView2设置Dock = DockStyle.Fill,确保内容填满标签页
  3. 在NewWindowRequested事件中,直接使用e.Uri获取弹窗请求的链接,传递给新WebView2导航
  4. 将InitBrowser改为返回Task,避免异步void的潜在问题,加载时用_ = InitBrowser()忽略返回值

内容的提问来源于stack exchange,提问作者samy nathan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 05:54:37