C# 打开新窗口

C# 打开新窗口,c#,winforms,browser,cefsharp,C#,Winforms,Browser,Cefsharp,好,大家, 我一直在自寻烦恼,在过去的几天里一直在寻找并试图找到一个解决方案,但运气不佳 运行最新版本的CefSharp,编码c#和vuejs。我可以通过localhost轻松获得Form1来显示我的主网页。chromium浏览器的设置和初始化正常。我可以通过网页与c#进行通信 browser.JavascriptObjectRepository.Register("bBrowser", new JSInterface(), true); 在javascript方面,我有以下内容 async

好,大家,

我一直在自寻烦恼,在过去的几天里一直在寻找并试图找到一个解决方案,但运气不佳

运行最新版本的CefSharp,编码c#和vuejs。我可以通过localhost轻松获得Form1来显示我的主网页。chromium浏览器的设置和初始化正常。我可以通过网页与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按钮上执行Click(),结果与上面相同

有人能告诉我创建多个winforms的正确方向吗?每个winforms都有自己的浏览器

谢谢,


Kory

您需要在
WinForms UI线程
上打开表单,下面是一个大致类似的示例(我用Notepad++编写了这个示例,所以我还没有测试它是否编译,您应该了解基本的想法)


请指定您正在使用的确切版本,最新版本是相对的。在几个月后,任何版本都将意味着不同的内容。您需要在WinForms UI线程上调用UI代码。在JSInterface类中,在构造函数中传递对窗体的引用,然后使用该引用在UI线程上调用。对不起,是的,CEFSharp Common是75.1.142。@amaitland我将传递对Form1或StandingForm的引用吗?我的意思是,在你的实例中,当前活动的表单Form1@amaitland好的,我已经准备好了。是否有资源可用于学习如何调用此特定案例。
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;
    }
}