Почему команды пользовательского контекстного меню CefSharp не работают большую часть времени? - PullRequest
0 голосов
/ 14 февраля 2019

Я реализовал пользовательское контекстное меню для CefSharp на основе этого примера со страницы CefSharp github, чтобы обойти проблему, что события запускаются в разных потоках, в результате чего контекстное меню не закрывалось при щелчке снаружи.

Я просто скопировал и вставил его из оригинального источника, просто добавил еще несколько случаев для команд, и вначале это работало.Однако команды выполняются только иногда (в большинстве случаев нет).

Я добавил Console.WriteLine() в код, чтобы проверить, что происходит, и кажется, что выполнение команды иногда отменяется до того, как онаготово.

Я не уверен, является ли это ошибкой в ​​CefSharp или CEF, или же реализация примера просто не завершена.Я попытался удалить обработчик menu.Closed, просто в качестве эксперимента, но, похоже, это ничего не меняет.

Я искал в Интернете, но не смог найти ошибку, соответствующую описанию, поэтому я предполагаю, что это я.К сожалению, мне трудно обдумать это.Если бы кто-то мог указать мне правильное направление или указать на ошибку, это было бы неплохо.

Пока мой код в основном такой же, как в этом примере , но со всеми случаями длякоманды.

Я создал простое тестовое приложение, которое представляет собой не что иное, как окно с браузером, но проблема сохраняется, хотя это случается реже.Проект Visual Studio, который я создал для тестирования, можно загрузить здесь .

Если вы попытаетесь несколько раз скопировать вставку слова из контекстного меню, вы должны увидеть, что он работает только с70% времениЯ предполагаю, что это случается реже, чем в моем реальном приложении, потому что мое настоящее приложение является большим монстром по сравнению с тестовым приложением и поэтому медленнее.

enter image description here

Cef - версия 3.3396.1786
CefSharp.Wpf - версия 67.0.0
ОС: Win10 x64

1 Ответ

0 голосов
/ 19 февраля 2019

Проблема не в CefSharp или Chromium.В примере используется RelayCommand для команд MenuItem, у которых есть параметр keepTargetAlive.Параметр по умолчанию установлен на false.Добавление true в качестве аргумента решает его, и команды всегда выполняются.

Пример:

menu.Items.Add(new MenuItem
{
    Header = item.Item1.Replace("&", "_"),
    IsEnabled = item.Item3,
    Command = new RelayCommand(() =>
    {
        map_browser_functions(browser, parameters, item);
    }, keepTargetAlive: true)
});
...