首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >以编程方式使用webview2在winforms c#中打开新选项卡上的弹出链接

以编程方式使用webview2在winforms c#中打开新选项卡上的弹出链接
EN

Stack Overflow用户
提问于 2022-08-12 05:02:26
回答 1查看 341关注 0票数 1

我在该webview中添加了选项卡控件,让我们考虑一下wv1,我在这个webview上打开一个pop链接,这个弹出链接将在新选项卡和新webview2上打开。

单击下面引用img 在运行代码wv1 on tab2映像后,尝试它按钮弹出链接将在新选项卡内的新webview2上打开

代码:

代码语言:javascript
代码运行次数:0
运行
复制
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);
        }
    }
}
EN

回答 1

Stack Overflow用户

发布于 2022-09-24 23:52:20

让它像真正的浏览器一样工作怎么样?简单地说,在一个新的Tab中打开。仅用几行代码;)

首先,创建一个从WebView2继承并在其中包含TabControl字段的新类:

代码语言:javascript
代码运行次数:0
运行
复制
internal class WebViewInTab:WebView2
{
    TabControl tabCtrl;

    public WebViewInTab(TabControl tabCtrl) :base()
        {
            Dock = DockStyle.Fill; // necessary for showing 
            this.tabCtrl = tabCtrl; // for adding new TabPage controls
            CoreWebView2InitializationCompleted += WebViewInTab_CoreWebView2InitializationCompleted;

然后,您将在每次引发CoreWebView2.NewWindowRequested事件时使用这个自定义webview2创建新的webview2对象。因此,要处理这个事件:

代码语言:javascript
代码运行次数:0
运行
复制
private void WebViewInTab_CoreWebView2InitializationCompleted(object? sender, Microsoft.Web.WebView2.Core.CoreWebView2InitializationCompletedEventArgs e)
{
    CoreWebView2.NewWindowRequested += CoreWebView2_NewWindowRequested; // This is the man
    CoreWebView2.DocumentTitleChanged += CoreWebView2_DocumentTitleChanged; // Just cosmetic code
}

之后,您将自己处理新窗口,即只需将一个新的TabPage控件与我们的自定义webview2添加到TabControl TabPages集合中即可。当然,不要忘记处理程序arg中的Uri

代码语言:javascript
代码运行次数:0
运行
复制
private void CoreWebView2_NewWindowRequested(object? sender, Microsoft.Web.WebView2.Core.CoreWebView2NewWindowRequestedEventArgs e)
    {
        e.Handled = true; // let the default new window 

        TabPage tpage = new TabPage(); // boy

        tpage.Controls.Add(new WebViewInTab(tabCtrl) { Source = new Uri(e.Uri)}); // toy

        tabCtrl.TabPages.Add(tpage); // daddy
        tabCtrl.SelectedTab = tpage; // user expectation
    }

//Just cosmetic code
private void CoreWebView2_DocumentTitleChanged(object? sender, object e)
    {
        int last = tabCtrl.TabPages.Count - 1;
        tabCtrl.TabPages[last].Text = CoreWebView2.DocumentTitle
    }
}

最后,:)在主app表单构造函数中启动recursion-ready操作。

代码语言:javascript
代码运行次数:0
运行
复制
public Form1()
        {
            InitializeComponent();
            string uriAdd = "https://www.w3schools.com/";
            tabControl1.TabPages[0].Controls.Add(new WebViewInTab(tabControl1) { Source = new Uri(uriAdd) });
        }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73329442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档