为什么 CefSharp 自定义上下文菜单命令大部分时间都不起作用?

Why do CefSharp custom context menu commands not work most of the time?

我基于 CefSharp github 页面的 this example 为 CefSharp 实现了自定义上下文菜单,以解决事件在不同线程中触发导致上下文菜单无法关闭的问题单击外部时。

我基本上是从原始来源复制粘贴的,只是为命令添加了一些情况,一开始似乎有效。但是,这些命令仅在某些时候执行(大部分时间不执行)。

我在代码中添加了一些 Console.WriteLine() 来检查发生了什么,似乎命令的执行有时在完成之前就被取消了。

我不确定这是 CefSharp 或 CEF 中的错误,还是示例实现不完整。我试图删除 menu.Closed 处理程序,就像一个实验,但它似乎没有什么区别。

我在互联网上搜索过,但找不到与描述相符的错误,所以我猜是我。不幸的是,我很难理解这个问题。如果有人能指出我正确的方向,或者指出错误,那就太好了。

到目前为止,我的代码与 this example 基本相同,但命令的所有情况都相同。

我创建了一个简单的测试应用程序,它只不过是一个 Window 浏览器,但问题仍然存在,尽管它发生的频率较低。我为测试创建的Visual Studio项目可以下载here

如果您尝试使用上下文菜单多次复制粘贴一个字词,您应该会发现它只有大约 70% 的时间有效。我想它在我的实际应用程序中发生的频率较低,因为与测试应用程序相比,我的实际应用程序是一个大怪物,因此速度较慢。

Cef 的版本是 3.3396.1786
CefSharp.Wpf 是版本 67.0.0
OS:Win10 x64

问题不在于 CefSharp 或 Chromium。该示例对具有参数 keepTargetAlive 的 MenuItem 命令使用 RelayCommand。默认情况下,该参数设置为 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)
});

在某些情况下,RelayCommand 是不够的。 (以pdf形式粘贴) 使用调度程序解决:

menu.Items.Add(new MenuItem
{
   Header = item.Item1.Replace("&", "_"),
   IsEnabled = item.Item3,
   Command = new RelayCommand(() =>
   {
      Application.Current.Dispatcher.BeginInvoke((Action)(() =>
      {
         switch (item.Item2)
         {
            case CefMenuCommand.Back:
            {
               browser.GoBack();
               break;
    //...