CEFSharp打开新窗口

问题描述 投票:1回答:1

好的,

我感到难过,在过去的几天里一直在寻找并试图找到一个没有运气的解决方案。

正在运行最新版本的CefSharp,对c#和vuejs进行编码。我可以通过localhost轻松获取Form1以显示我的主要网页。铬浏览器的设置和初始化很好。我可以通过

从网页传达回c#
browser.JavascriptObjectRepository.Register("bBrowser", new JSInterface(), true);

在JavaScript方面,我有以下内容

async openStandings(){
  await bBrowser.kappsopenStandings().then((result1)=>{ 
      this.filler = result1

       return result1                 
})
},

上面的代码在jsInterface类中调用以下c#函数

   public bool kappsopenStandings(
        )
    {

        bool m = false;


        Standings S = new Standings();

        S.Show();


        m = true;
        return m;
    }

上面的Standings类是具有以下Load函数和InitBrowser函数的表单。

private  void Standings_Load(object sender, EventArgs e)
    {
        this.StartPosition = FormStartPosition.CenterScreen;

        InitBrowser();
    }

和InitBrowser函数:

    public void InitBrowser()
    {

       standingsbrowser = new ChromiumWebBrowser(thelink);

        Dock = DockStyle.Fill;
        this.Controls.Add(standingsbrowser);

        Console.WriteLine("Created Window");
    }

好吧,发生的事就是创建了积分榜窗口,所有内容都冻结并挂起。

现在,通过我的研究,我了解到,当我从网页进行调用时,我并没有影响UI线程,这似乎是我的问题所在。

如果我在表单上放置一个实际的c#按钮,然后单击它,那一切都很好。我试图对Form1上的visible = false按钮执行PerformClick(),结果与上述相同。

有人可以指出正确的方向来创建多个具有各自浏览器的winform吗?

谢谢,

Kory

c# winforms browser cefsharp
1个回答
0
投票

您需要在WinForms UI Thread上打开表单,下面的示例大致如下(我在Notepad ++中编写了此代码,因此我没有测试它是否可以编译,您应该了解基本思想。)>

public class JSInterface
{
    private Form _form;

    public JSInterface(Form form)
    {
        _form = form;
    }

    public bool kappsopenStandings()
    {
        //Marshal onto the WinForms UI Thread
        _form.BeginInvoke(() =>
        {
            var standingsForm = new Standings();

            standingsForm.Show();
        });

        return true;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.