本文概述
- 1.创建一个自定义菜单处理程序
- 2.修改自定义处理程序
- 3.在浏览器上将自定义菜单处理程序设置为默认值
文章图片
如你所见, 默认选项并没有真正帮助, 因此你需要知道如何自定义它并添加新选项。
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控件上向本机上下文菜单添加新项】编码愉快!
推荐阅读
- 如何在PHP中使用Imagick区分(比较)2个图像
- 如何在线执行TWIG代码
- COMP5911先进工程
- Android,PopupMenu.show()时添加窗口失败
- 当我通过gmail或shareIt共享apk并且没有启动时,Android应用程序崩溃了
- FacebookLoginSKK 4 Apple Mach-O链接器错误
- Apple Mach-O链接器(id)错误 - 链接器命令失败,退出代码为1(使用-v查看调用)C ++ SFML
- 绑定MvvmCross TextColor不适用于Android
- 在Terraform Azure App服务资源中配置CORS