为什么CefSharp自定义上下文菜单命令在大多数情况下不起作用?

时间:2019-02-14 13:53:48

标签: wpf cefsharp chromium-embedded

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

我基本上是从原始源复制并粘贴它,只是为命令添加了更多情况,但它似乎一开始就可以工作。但是,命令仅在某些时候执行(大多数时候不是)。

我在代码中添加了Console.WriteLine()来检查正在发生的事情,看来命令的执行有时会在完成之前被取消。

我不确定这是CefSharp还是CEF中的错误,还是示例实现不完整。我尝试删除menu.Closed处理程序,就像做一个实验一样,但这似乎没什么作用。

我搜索了互联网,但找不到与描述相符的错误,所以我想是我。不幸的是,我很难解决这个问题。如果有人可以指出我正确的方向或指出错误,那将是很好的。

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

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

如果您尝试使用上下文菜单几次复制粘贴的单词,则应该看到它仅在70%的时间内有效。我猜它的发生频率不如我的实际应用程序,因为与测试应用程序相比,我的实际应用程序是一个巨大的怪物,因此速度较慢。

enter image description here

Cef是版本3.3396.1786
CefSharp.Wpf是67.0.0版
操作系统:Win10 x64

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

在某些情况下,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;
    //...