【问题标题】:Is there a way to add new tabs to a tabController on another thread through invokes?有没有办法通过调用将新选项卡添加到另一个线程上的 tabController?
【发布时间】:2021-06-17 07:58:32
【问题描述】:

我正在用 c# 制作一个使用选项卡系统的 WinForms 浏览器。为了防止在新选项卡中打开的链接在没有浏览器 UI 的情况下打开新窗口,我制作了 LifespanHandler。问题是当 Invoke 运行时出错

tabControl1.TabPages.Insert(lastIndex, "New Tab");

即使它正在运行新标签按钮运行的功能。这是代码

LifespanHandler:

class LifespanHandler : ILifeSpanHandler
        {
            public event Action<string> requestNewTab;
            public bool DoClose(IWebBrowser chromiumWebBrowser, IBrowser browser)
            {
                return true;
            }

            public void OnAfterCreated(IWebBrowser chromiumWebBrowser, IBrowser browser)
            {

            }

            public void OnBeforeClose(IWebBrowser chromiumWebBrowser, IBrowser browser)
            {
                
            }

            public bool OnBeforePopup(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, string targetUrl, string targetFrameName, WindowOpenDisposition targetDisposition, bool userGesture, IPopupFeatures popupFeatures, IWindowInfo windowInfo, IBrowserSettings browserSettings, ref bool noJavascriptAccess, out IWebBrowser newBrowser)
            {
                requestNewTab?.Invoke(targetUrl);
                newBrowser = null;
                return true;

            }
        }

在tabController上制作标签的部分:

        public void newTab(String url)
        {
            LifespanHandler lifespanHandler = new LifespanHandler();
            lifespanHandler.requestNewTab += newTab;
            var lastIndex = this.tabControl1.TabCount - 1;
            this.tabControl1.TabPages.Insert(lastIndex, "New Tab");
            this.tabControl1.SelectedIndex = lastIndex;
            tabControl1.SelectedTab.Text = "New Tab   ";
       {

我尝试将其设为调用 newTab 但结果相同的函数。 错误: System.ArgumentException: 'Controls created on one thread cannot be parented to a control on a different thread.'

【问题讨论】:

    标签: c# .net multithreading winforms


    【解决方案1】:

    您可以尝试使用 MethodInvoker,这样使用不同的线程在不同的线程中调用 UI 对象不会有问题。

        private void MyFunction(string url)
        {
            MethodInvoker inv = delegate
            {
              LifespanHandler lifespanHandler = new LifespanHandler();
              lifespanHandler.requestNewTab += newTab;
              var lastIndex = this.tabControl1.TabCount - 1;
              this.tabControl1.TabPages.Insert(lastIndex, "New Tab");
              this.tabControl1.SelectedIndex = lastIndex;
              tabControl1.SelectedTab.Text = "New Tab   ";
            };
    
            this.Invoke(inv);
    
        }
    

    【讨论】:

    • 它没有抛出错误,而是打开了我用来打开在新标签页中打开的弹出窗口/链接的东西。
    • 不确定你指的是什么“东西”
    猜你喜欢
    • 2022-06-15
    • 1970-01-01
    • 2010-11-12
    • 1970-01-01
    • 2013-06-15
    • 1970-01-01
    • 1970-01-01
    • 2016-12-07
    • 1970-01-01
    相关资源
    最近更新 更多