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

问题描述 投票:0回答:2

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

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

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

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

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

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

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

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

enter image description here

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

wpf cefsharp chromium-embedded
2个回答
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)
});

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;
    //...
© www.soinside.com 2019 - 2024. All rights reserved.