个性化阅读
专注于IT技术分析

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

本文概述

尽管我们已经写过关于如何防止上下文菜单出现在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.修改自定义处理程序

若要添加新项目, 请使用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
// ...

然后, 我们的上下文菜单将如下所示:

多上下文菜单

编码愉快!

赞(0)
未经允许不得转载:srcmini » 如何在WinForms中的CefSharp控件上向本机上下文菜单添加新项

评论 抢沙发

评论前必须登录!