john1990_1 Ответов: 0

Используя браузер cefsharp chromium, как сделать следующее?


Откройте текстовое поле в документе и получите или измените текст, а также щелкните мышью и отправьте действия над ним, также сфокусируйтесь на нем и выберите ввод.
Получите доступ к URL-адресу текущей страницы и поместите его в текстовое поле на событии AddressChanged браузера Chromium (еще один поток, который является основным).

Также как подавить ошибки скрипта в нем?

TabControlMain имеет tabPageGoogleTranslate, который имеет chromeBrowser.

System.InvalidOperationException: 'Cross-thread operation not valid: Control 'tabControlMain' accessed from a thread other than the thread it was created on.'


Приведенный ниже код показывает приведенную выше ошибку при отладке, поскольку он не может получить доступ к tabControlMain из потока chromeBrowser.

Что я уже пробовал:

ChromiumWebBrowser chromeBrowser;
        void InitChromeBrowser()
        {
            Cef.Initialize(new CefSettings());
            chromeBrowser = new ChromiumWebBrowser("http://translate.google.com");
            tabPageGoogleTranslate.Controls.Add(chromeBrowser);
            chromeBrowser.Dock = DockStyle.Fill;
            chromeBrowser.AddressChanged += ChromeBrowser_AddressChanged;
        }

        void ChromeBrowser_AddressChanged(object sender, AddressChangedEventArgs e)
        {
            if (tabControlMain.SelectedTab == tabPageGoogleTranslate)
            {
                textBoxURL.Invoke(new Action(() => textBoxURL.Text = chromeBrowser.Address));
            }
        }

F-ES Sitecore

Мы не знаем, что такое "tabControlMain", и вы не опубликовали сообщение об ошибке, поэтому я сомневаюсь, что кто-то может вам помочь.

john1990_1

Спасибо, обновил.

F-ES Sitecore

Я предполагаю, что здесь происходит какая-то многопоточность, о которой вы не упомянули и которой нет в коде, который вы опубликовали. Если вы хотите манипулировать элементами в своей форме, вы можете делать это только из кода, работающего в том же потоке, что и пользовательский интерфейс. Вот почему вы делаете "txtBoxUrl.Invoke", вы заставляете это действие выполняться в том же потоке, в котором был создан txtBoxUrl. Вы должны сделать это со всем кодом, который обращается к элементам пользовательского интерфейса. Возможно, создайте метод "AddressChanged" в своей форме, а в ChromeBrowser_AddressChanged ничего не делайте, кроме как вызывайте его в нужном потоке.

john1990_1

Thx, как я могу вызвать длинный блок кода в основной поток из потока chromeBrowser.

F-ES Sitecore

Поместите код в метод и используйте Invoke для вызова этого метода. Здесь приведен пример использования делегатов для вызова методов

https://docs.microsoft.com/en-us/dotnet/framework/winforms/controls/how-to-make-thread-safe-calls-to-windows-forms-controls

john1990_1

Тнх,
https://imgur.com/a/JdUnOha

john1990_1

EDIT: я решил эту проблему в Imgur pic, не могли бы вы ответить на другие вопросы, которые я задал в главном вопросе?

0 Ответов