CEFSharp Открыть в новом окне - PullRequest
1 голос
/ 03 октября 2019

Ладно, все,

Я поставил себя в тупик, провел последние несколько дней в поисках и поиске решения без удачи.

Запуск последней версии CefSharp, кодирование c # и vuejs. Я могу легко заставить Form1 отображать мою главную веб-страницу через localhost. Настройка и инициализация браузера хрома в порядке. Я могу общаться с веб-страницы обратно на c # через

browser.JavascriptObjectRepository.Register("bBrowser", new JSInterface(), true);

На стороне JavaScript у меня есть следующее

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

       return result1                 
})
},

Приведенный выше код вызывает следующую функцию c # в jsInterfaceclass

   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");
    }

Итак, что происходит, создается окно турнирной таблицы, и все зависает и зависает.

Теперь, благодаря моим исследованиям, я понимаю, что, когда я звоню с веб-страницы, я не влияю на поток пользовательского интерфейса, который, кажется, где моя проблема.

Если я помещу фактическую кнопку c # в форму и нажму на нее, все в порядке. Я попытался выполнить PerformClick () для кнопки visible = false в Form1 с теми же результатами, что и выше.

Может ли кто-нибудь указать мне правильное направление для создания нескольких winforms, каждый со своим собственным просмотром?

Спасибо,

Kory

1 Ответ

0 голосов
/ 04 октября 2019

Вам нужно открыть форму на 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;
    }
}
...