Как добавить новые элементы в собственное контекстное меню элемента управления CefSharp в WinForms

Хотя мы уже писали о как предотвратить появление контекстного меню в вашем элементе управления CefSharp, поскольку обычно вы можете лучше создать собственное контекстное меню с помощью JavaScript, вы можете использовать контекстное меню по умолчанию для элемента управления CefSharp:

Контекстное меню 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. Измените пользовательский обработчик

Чтобы добавить новый элемент, используйте AddItem метод IMenuModel аргумент в onBeforeContextMenu функция. Этот метод ожидает в качестве первого аргумента уникальное целое число (предоставленное вами) от От 26500 до 28500 который будет использоваться в качестве идентификатора для запуска некоторых действий на onContextMenuCommand, Поэтому следует начинать с нового элемента с идентификатором 28501, чтобы избежать наложения диапазонов хрома и идентификатора CEF. Ты можешь видеть полный файл Enum команд меню CefSharp здесь. В качестве второго аргумента необходимо указать строку, которая будет использоваться в качестве метки для нового элемента в списке контекстного меню.

В соответствии с указанным идентификатором для элемента вы можете проверить, какой элемент в списке был выбран командой OnContextMenu, с помощью простого оператора if и выполнения действий в соответствии с ним. В следующем примере показано, как добавить 3 элемента в текущее контекстное меню (для удаления любого предыдущего элемента используйте model.Clear method), соответственно они покажут и закроют инструменты dev, а последний отобразит предупреждающее сообщение:

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. Установите свой собственный обработчик меню в браузере по умолчанию

Как только класс был изменен и стал доступен в вашем проекте, вам нужно только установить значение MenuHandler собственность вашего ChromiumWebBrowser как новый экземпляр вашего пользовательского обработчика меню. Это может быть достигнуто при создании браузера в вашем текущем коде, например:

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
// ...

Тогда наше контекстное меню будет выглядеть так:

Многоконтекстное меню

Ссылка на основную публикацию
Adblock
detector