Браузер CefSharp WinForms, размещенный в WPF WinFormsHost

В настоящее время я работаю над переносом программного обеспечения для киосков, которое запускает Awesomium вместо CefSharp. Наше основное приложение написано на WPF, и в этой работе используется CefSharp версии 45.

Я знаю, что элемент управления WPF имеет некоторые серьезные проблемы с производительностью, по сравнению с версией WinForms, размещенной в WindowsFormsHost, плавность переходов и т. д. НАМНОГО лучше.

С этой целью я собираюсь придерживаться этого подхода к внедрению WinForms ChromiumWebBrowser внутри WindowsFormsHost в окне WPF. Все это работает, но у меня возникают проблемы с работой сенсорной поддержки. Наши киоски имеют сенсорные экраны и работают под управлением Windows 7 / 8.1, сенсорное управление работает безупречно с управлением WPF, однако при использовании встроенного WinForms одно касание вообще не работает. Помимо того, что сенсорный экран не работает, он также крадет все события клавиатуры и, похоже, потребляет их внутри, поскольку ни один из моих обработчиков событий никогда не срабатывает в главном окне WPF.

Если у кого-то есть какие-либо идеи или может указать мне правильное направление, чтобы попытаться решить эту проблему, я был бы очень признателен!

Спасибо


person OpticFroggy    schedule 02.12.2015    source источник


Ответы (1)


Сценарий, о котором вы говорите, не очень хорошо поддерживается, и поэтому информации не так много. Многие проблемы, которые вы видите, вероятно, связаны с тем, что CEF запускает цикл обработки сообщений в отдельном потоке. Если вы отключите MultiThreadedMessageLoop, вы станете ответственным за вызов Cef.DoMessageLoopWork(). Недавно я добавил примерную демонстрацию файла WinForms Example. Вероятно, вы можете перенести это на WPF, хотя я никогда не пробовал.

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

Для справки есть несколько способов улучшить производительность WPF. Однако они имеют свой собственный набор недостатков. См. https://github.com/cefsharp/CefSharp/blob/cefsharp/45/CefSharp.Example/CefExample.cs#L58

person amaitland    schedule 02.12.2015
comment
Спасибо за ответ! Я пробовал эти улучшения производительности WPF, и они действительно имеют эффект, на самом деле очень заметный. Проблема в том, что когда вы затем тестируете это бок о бок с WinForms самостоятельно или размещаете внутри WPF, скорость снова кажется скачком выше. Я посмотрю, смогу ли я получить различные сведения о цикле сообщений и вашем примере для работы с WPF, и если мне повезет, я дам вам знать. - person OpticFroggy; 03.12.2015
comment
Таким образом, запуск его в WinFormsHost, а затем явный вызов DoMessageLoopWork(), кажется, решает часть проблемы. Это позволяет запускать события ввода на уровне WPF, поэтому мой ярлык для открытия инструментов разработчика и других специфичных для приложения вещей теперь работает. Можно ли каким-либо образом внедрить некоторые из этих событий в браузер CefSharp в качестве сенсорного события? Единственный смутно связанный метод, который я вижу, это SendMouseWheelEvent. - person OpticFroggy; 03.12.2015
comment
Ничего из коробки, сенсорная поддержка не была реализована выше по течению. См. bitbucket.org/chromiumembedded/cef/issues. /1059/ и github.com/cefsharp/CefSharp/pull/1418 - person amaitland; 03.12.2015
comment
Ах, я думал, что видел что-то об этом в своих поисках, в таком случае, как вы думаете, было бы возможно направить сенсорные клики через простые щелчки мыши? Я не понимаю, почему это не сработает, мне просто нужно решить, как/куда вводить или отображать события. - person OpticFroggy; 03.12.2015
comment
Скорее всего, вы сможете опубликовать WP_Touch сообщения msdn.microsoft.com/en-us/library/windows/desktop/ - person amaitland; 03.12.2015