CefSharp 自定义右键菜单 (Winform版)

右键菜单功能由IContextMenuHandler接口定义.
 
具体代码如下:
 
C#代码
  1. /* 引用 
  2. using CefSharp; 
  3. using CefSharp.WinForms; 
  4. using System; 
  5. using System.Collections.Generic; 
  6. */  
  7.    
  8.    
  9. public class MenuHandler : IContextMenuHandler  
  10.     {  
  11.         void IContextMenuHandler.OnBeforeContextMenu(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, IMenuModel model)  
  12.         {  
  13.             //主要修改代码在此处;如果需要完完全全重新添加菜单项,首先执行model.Clear()清空菜单列表即可.  
  14.             //需要自定义菜单项的,可以在这里添加按钮;  
  15.             if (model.Count > 0)  
  16.             {  
  17.                 model.AddSeparator();//添加分隔符;  
  18.             }  
  19.             model.AddItem((CefMenuCommand)26501, "Show DevTools");  
  20.             model.AddItem((CefMenuCommand)26502, "Close DevTools");  
  21.         }  
  22.    
  23.         bool IContextMenuHandler.OnContextMenuCommand(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, CefMenuCommand commandId, CefEventFlags eventFlags)  
  24.         {  
  25.             //命令的执行,点击菜单做什么事写在这里.  
  26.             if (commandId == (CefMenuCommand)26501)  
  27.             {  
  28.                 browser.GetHost().ShowDevTools();  
  29.                 return true;  
  30.             }  
  31.             if (commandId == (CefMenuCommand)26502)  
  32.             {  
  33.                 browser.GetHost().CloseDevTools();  
  34.                 return true;  
  35.             }  
  36.             return false;  
  37.         }  
  38.    
  39.         void IContextMenuHandler.OnContextMenuDismissed(IWebBrowser browserControl, IBrowser browser, IFrame frame)  
  40.         {  
  41.             var webBrowser = (ChromiumWebBrowser)browserControl;  
  42.             Action setContextAction = delegate ()  
  43.             {  
  44.                 webBrowser.ContextMenu = null;  
  45.             };  
  46.             webBrowser.Invoke(setContextAction);  
  47.         }  
  48.    
  49.         bool IContextMenuHandler.RunContextMenu(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, IMenuModel model, IRunContextMenuCallback callback)  
  50.         {  
  51.             //return false 才可以弹出;  
  52.             return false;  
  53.         }  
  54.    
  55.         //下面这个官网Example的Fun,读取已有菜单项列表时候,实现的IEnumerable,如果不需要,完全可以注释掉;不属于IContextMenuHandler接口规定的  
  56.         private static IEnumerable<Tuple<string, CefMenuCommand, bool>> GetMenuItems(IMenuModel model)  
  57.         {  
  58.             for (var i = 0; i < model.Count; i++)  
  59.             {  
  60.                 var header = model.GetLabelAt(i);  
  61.                 var commandId = model.GetCommandIdAt(i);  
  62.                 var isEnabled = model.IsEnabledAt(i);  
  63.                 yield return new Tuple<string, CefMenuCommand, bool>(header, commandId, isEnabled);  
  64.             }  
  65.         }  
  66.     }  
调用很简单,如下:
C#代码
  1. //在初始化ChromiumWebBrowser后,指定其MenuHandler 即可.  
  2. browser1.MenuHandler = new MenuHandler();  
这样就实现了自定义菜单项,及设定自定义菜单项的功能.

关于代码,再啰嗦几点:

1.CefSharp右键菜单功能由IContextMenuHandler接口定义.

2.有的人看了官方的例子,可能会卡在webBrowser.Dispatcher.Invoke上面. winfrom中是没有Dispatcher的,Dispatcher只是调度器,在winform中直接使用Invoke调用即可,跟平时写的跨线程的UI访问需要使用委托来访问以确保线程安全一样.

3.官方的Example也是显示实现接口,文章代码尽量与翻译官方Example所以写的显示实现接口,实际上隐式实现接口是一样可用的.

4.官方Example中在 RunContextMenu 方法中写了一大串的代码,实现了完整的WPF菜单栏绘制,是对winform版本的开发者的主要误导之一。(实际上Example中有注释申明了使用内置的ContextMenu只需要返回false即可,是由于WPF中需要集成到现有的消息循环中才需要重绘)

所以遇到问题还是要多看官方的文档,因为转载者基本上把这段注释改掉了,如果你尝试在winform中在这里模仿wpf代码进行重绘,测了下可以成功,但是弹出速度极慢,重绘代码不发了,因为弹出速度感人毫无参考意义,winform即便是要重绘也应该是在OnBeforeContextMenu里面设定才对.

关于需要彻底禁用右键菜单,只要理解了上面的代码,就应该知道有很多很多处地方都可以实现,随便任意一处即可.

5. 右键菜单中的点击后的功能是什么,这些都是可以自己设定的.

右键菜单的功能的设定和可以实现的功能,不一定局限于浏览器基础功能的范畴,

也可以实现其它浏览器之外的其它任务和工作也是可以的,灵活运用即可.



上一篇: VB.net连接mysql数据库
下一篇: 【CefSharp】 禁用右键菜单 与 控制弹出窗口的方式(限版本39.0.0.1)
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: c#
相关日志:
评论: 0 | 引用: 0 | 查看次数: 170
发表评论
昵 称:
密 码: 游客发言不需要密码.
邮 箱: 邮件地址支持Gravatar头像,邮箱地址不会公开.
网 址: 输入网址便于回访.
内 容:
验证码:
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.
字数限制 1000 字 | UBB代码 开启 | [img]标签 关闭

 广告位

↑返回顶部↑