如何使用accelerator在上下文菜单中调用menu item?
var menu = new Menu();
menu.append(new MenuItem({
label: 'Say something',
click: function(){
alert("Hello");
},
accelerator: "CmdOrCtrl+E"
}));
window.addEventListener('contextmenu', function (e) {
e.preventDefault();
menu.popup(currentWindow);
}, false);以上代码起作用。出现上下文菜单,当单击菜单项时,单击回调生效。
但是加速器命令不起作用。有什么想法吗?
附带问题:
我可以将click event传递给menu.popup,然后将它传递给menu-item click callback吗?现在,我只是将click事件存储在一个全局变量中。
发布于 2015-07-28 02:57:06
我不相信电子会注册加速器,除非你叫Menu.setApplicationMenu(menu)或类似的。在你的片段中,你创建了一个菜单,但是在调用弹出方法之前,你不会对它做任何事情。在注册加速器之前,电子如何知道你想要使用它?它们在设置为“应用程序”菜单时被注册。
尽管如此,它看起来并不像电子提供了一种简单的方式来注册一个本地的、渲染程序专用的快捷方式,而不创建一个BrowserWindow菜单。您可以在这个问题中读到更多有关它的内容:https://github.com/atom/electron/issues/1334 (译),在OSX中,加速器由OS的菜单系统处理,而不是由电子处理,因此在没有菜单的情况下为这些本地化快捷方式添加跨平台支持将需要对OSX版本进行大量的工作。
建议的解决方案是在JavaScript中捕获您想要的快捷方式,然后以这种方式触发命令。您仍然可以使用加速器选项来表示上下文菜单中的键组合。
发布于 2019-06-02 01:40:02
我发现今天注册上下文菜单加速器的最简单方法是将上下文菜单附加到应用程序菜单中,这将注册它们,但是设置visible: false,使它们不会实际出现。
在使用菜单模板时非常简单。
function registerAppMenu(app, invisibleMenus) {
const template = [ ... ]; // use app to create the file-menu
template.push(...invisibleMenus.map(menu => ({...menu, visible: false})));
Menu.setApplicationMenu(Menu.buildFromTemplate(template));
}发布于 2019-04-03 22:34:16
最好用这个来代替:
const {Menu} = require('electron').Menu;
const mainMenu = Menu.buildFromTemplate(mainMenuTemplate);
Menu.setApplicationMenu(mainMenu)所以你可以用
mainMenuTemplate.push({
/* your menu item properties*/
});`把它推到最后。使用unshift()而不是push()将其添加到mainMenuTemplate的开头,但是即使是加速器也被添加并按其应有的方式工作。
https://stackoverflow.com/questions/31637084
复制相似问题