本文概述
尽管我们已经写过关于如何防止上下文菜单出现在CefSharp控件中的文章, 但是由于通常可以使用JavaScript创建更好的自定义上下文菜单, 因此你可能仍要使用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 list
if (model.Count > 0)
{
model.AddSeparator();
}
// Add a new item to the list using the AddItem method of the model
model.AddItem((CefMenuCommand)26501, "Show DevTools");
model.AddItem((CefMenuCommand)26502, "Close DevTools");
// Add a separator
model.AddSeparator();
// Add another example item
model.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 settings
Cef.Initialize(settings);
// Create a browser component
ChromiumWebBrowser chromeBrowser = new ChromiumWebBrowser("www.somewebsite or file.com");
// Register your Custom Menu Handler as default
chromeBrowser.MenuHandler = new MyCustomMenuHandler();
// ...
// Rest of your code
// ...
然后, 我们的上下文菜单将如下所示:
编码愉快!
评论前必须登录!
注册