我基于CefSharp github页面上的this example为CefSharp实现了自定义上下文菜单,以解决事件在不同线程中触发的问题,从而导致在外部单击时关闭上下文菜单。
我基本上是从原始源复制并粘贴它,只是为命令添加了更多情况,但起初似乎可以工作。但是,仅有时执行命令(大多数时间不执行)。
我在代码中添加了一些Console.WriteLine()
来检查正在发生的事情,似乎有时命令执行之前被取消了。
我不确定这是CefSharp还是CEF中的错误,或者示例实现是否不完整。我尝试删除menu.Closed
处理程序,就像做一个实验一样,但这似乎没有什么区别。
我搜索了互联网,但找不到与描述相符的错误,所以我想是我。不幸的是,我很难解决这个问题。如果有人可以指出我正确的方向或指出错误,那就太好了。
到目前为止,我的代码基本上与this example相同,但命令的所有情况都相同。
我创建了一个简单的测试应用程序,该应用程序不过是带有浏览器的窗口,但问题仍然存在,尽管它的发生频率较低。我创建的用于测试的Visual Studio项目可以下载here。
[如果您尝试使用上下文菜单几次复制粘贴的单词,您应该看到它仅在70%的时间内有效。我猜它的发生频率不如我的实际应用程序,因为与测试应用程序相比,我的实际应用程序是一个巨大的怪物,因此速度较慢。
Cef是版本3.3396.1786CefSharp.Wpf是版本67.0.0操作系统:Win10 x64
问题不是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)
});
在某些情况下,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;
//...