如何在WinForms中的CefSharp控件上向本机上下文菜单添加新项

本文概述

  • 1.创建一个自定义菜单处理程序
  • 2.修改自定义处理程序
  • 3.在浏览器上将自定义菜单处理程序设置为默认值
尽管我们已经写过关于如何防止上下文菜单出现在CefSharp控件中的文章, 但是由于通常可以使用JavaScript创建更好的自定义上下文菜单, 因此你可能仍要使用CefSharp控件的默认上下文菜单:
如何在WinForms中的CefSharp控件上向本机上下文菜单添加新项

文章图片
如你所见, 默认选项并没有真正帮助, 因此你需要知道如何自定义它并添加新选项。
1.创建一个自定义菜单处理程序 首先需要在项目上创建一个新类MyCustomMenuHandler(可以根据需要更改名称), 该类需要使用应用程序的名称空间并扩展IContextMenuHandler, 因此显然应该导入CefSharp , System和System.Windows.Forms命名空间插入你的类, 如下所示:
using System; using CefSharp; using System.Windows.Forms; public class MyCustomMenuHandler : IContextMenuHandler{public void OnBeforeContextMenu(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, IMenuModel model){}public bool OnContextMenuCommand(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, CefMenuCommand commandId, CefEventFlags eventFlags){return false; }public void OnContextMenuDismissed(IWebBrowser browserControl, IBrowser browser, IFrame frame){}public bool RunContextMenu(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, IMenuModel model, IRunContextMenuCallback callback){return false; }}

这只是一个示例, 目前该类不执行任何操作, 但是你应该从你的自定义处理程序中开始, 以了解如何添加或删除项目。
2.修改自定义处理程序 若要添加新项目, 请使用onBeforeContextMenu函数中IMenuModel参数的AddItem方法。此方法期望从26500到28500的唯一整数(由你提供)作为第一个参数, 该整数将用作ID来触发onContextMenuCommand上的某些操作。因此, 你应该从ID为28501的新项目开始, 以避免重叠Chromium和CEF ID范围。你可以在此处查看CefSharp菜单命令的完整Enum文件。作为第二个参数, 你需要提供一个字符串, 它将用作上下文菜单列表上新项目的标签。
根据给定的元素ID, 可以使用简单的if语句并根据其执行操作, 以检查OnContextMenu命令上单击了列表中的哪个元素。下面的示例演示如何向当前上下文菜单添加3个项目(要使用model.Clear方法删除任何先前的元素), 它们将分别显示和关闭开发工具, 最后一个将显示警报消息:
using System; using CefSharp; using System.Windows.Forms; public class MyCustomMenuHandler : IContextMenuHandler{public void OnBeforeContextMenu(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, IMenuModel model){// Remove any existent option using the Clear method of the model////model.Clear(); Console.WriteLine("Context menu opened !"); // You can add a separator in case that there are more items on the listif (model.Count > 0){model.AddSeparator(); }// Add a new item to the list using the AddItem method of the modelmodel.AddItem((CefMenuCommand)26501, "Show DevTools"); model.AddItem((CefMenuCommand)26502, "Close DevTools"); // Add a separatormodel.AddSeparator(); // Add another example itemmodel.AddItem((CefMenuCommand)26503, "Display alert message"); }public bool OnContextMenuCommand(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, CefMenuCommand commandId, CefEventFlags eventFlags){// React to the first ID (show dev tools method)if (commandId == (CefMenuCommand)26501){browser.GetHost().ShowDevTools(); return true; }// React to the second ID (show dev tools method)if (commandId == (CefMenuCommand)26502){browser.GetHost().CloseDevTools(); return true; }// React to the third ID (Display alert message)if (commandId == (CefMenuCommand)26503){MessageBox.Show("An example alert message ?"); return true; }// Any new item should be handled through a new if statement// Return false should ignore the selected option of the user !return false; }public void OnContextMenuDismissed(IWebBrowser browserControl, IBrowser browser, IFrame frame){}public bool RunContextMenu(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, IMenuModel model, IRunContextMenuCallback callback){return false; }}

3.在浏览器上将自定义菜单处理程序设置为默认值 修改了类并在你的项目中使用该类之后, 你只需将ChromiumWebBrowser的MenuHandler属性的值设置为自定义菜单处理程序的新实例即可。这可以在使用当前代码创建浏览器期间实现, 例如:
CefSettings settings = new CefSettings(); // Some settings if you have, here// Initialize cef with the provided settingsCef.Initialize(settings); // Create a browser componentChromiumWebBrowser chromeBrowser = new ChromiumWebBrowser("www.somewebsite or file.com"); // Register your Custom Menu Handler as defaultchromeBrowser.MenuHandler = new MyCustomMenuHandler(); // ...// Rest of your code// ...

然后, 我们的上下文菜单将如下所示:
如何在WinForms中的CefSharp控件上向本机上下文菜单添加新项

文章图片
【如何在WinForms中的CefSharp控件上向本机上下文菜单添加新项】编码愉快!

    推荐阅读