如何更改电子快速启动示例应用程序的本机菜单
How to change native menu of electron-quick-start example app
Electron 应用程序打开时使用的默认菜单与 electron-quick-start 示例应用程序中出现的默认菜单相同,如何更改它?
还尝试了 menu example on the docs 但没有任何变化。
当我用 mainWindow.setMenu(null);
隐藏菜单时,菜单消失了,但仍然无法初始化新菜单
有什么想法吗?
平台:windows7
电子版:0.36.4
参考文件:
package.json:
{
"name": "electric_timer",
"version": "0.1.0",
"description": "a Time sheet & project managment",
"main": "app.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",
"url": "none"
},
"author": "Eyal Ron",
"license": "MIT"
}
app.js:
var app = require('app');
var BrowserWindow = require('browser-window');
app.on('ready', function (){
var mainWindow = new BrowserWindow({
width: 800,
height: 600
});
mainWindow.setMenu(null);
mainWindow.loadUrl('file://' + __dirname + '/main.html');
});
main.js:
var remote = require('remote');
var Menu = remote.require('menu');
var menu = Menu.buildFromTemplate([
{
label: 'Electron',
submenu: [
{
label: 'Prefs',
click: function(){
alert('hello menu');
}
}
]
}
]);
Menu.setApplicationMenu(menu);
main.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>electron test</title>
</head>
<body>
<h1>hello world</h1>
<script>requier('./main.js')</script>
</body>
</html>
电子的'default_app'sets the menu;如果你想避免这种情况,你需要 Electron 直接启动你的应用程序,而不是通过默认应用程序(注意:如果你使用类似 electron .
的东西启动你的应用程序,你实际上启动了默认应用程序)。
Electron looks in its resource folder 用于 'app'、'app.asar' 或 'default_app',因此要直接启动您的应用,您需要复制或 link进入 Electron 的资源文件夹。
无论您如何启动您的应用程序,您都可以使用 Menu.setApplicationMenu 设置您的菜单——您可以在主进程中执行此操作,您不需要像示例中那样在渲染器中执行此操作.顺便说一下,您的 main.html 中有一个拼写错误(requier 而不是 require),因此如果这是您的实际代码,则表明您的 main.js 根本没有 运行。
将自定义菜单的逻辑放入 app('ready') 事件回调。尝试以下代码示例
const {app, BrowserWindow, Menu} = require('electron');
let mainWindow;
let menuTemplate = [
{
label: "Window Manager",
submenu: [
{ label: "create New" }
]
},
{
label : "View",
submenu : [
{ role : "reload" },
{ label : "custom reload" }
]
}
];
function appInit () {
// Create the browser window.
mainWindow = new BrowserWindow({width: 800, height: 600})
// and load the main.html of the app.
mainWindow.loadFile('main.html')
let menu = Menu.buildFromTemplate(menuTemplate);
Menu.setApplicationMenu(menu);
}
app.on('ready', () => {
appInit();
})
Electron 在您的应用中在哪里?您的 package.json
文件应如下所示:
{
"name": "todos",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"electron": "electron ."
},
"author":
"Who Cares <email@example.com> (https://doesntmatter.com/)",
"license": "MIT",
"dependencies": {
"electron": "3.0.8"
}
}
您的 Electron 端将如下所示:
const electron = require('electron');
const { app, BrowserWindow, Menu } = electron;
let mainWindow;
app.on('ready', () => {
mainWindow = new BrowserWindow({});
mainWindow.loadURL(`file://${__dirname}/main.html`);
const mainMenu = Menu.buildFromTemplate(menuTemplate);
Menu.setApplicationMenu(mainMenu);
});
const menuTemplate = [
{
label: 'File'
}
];
即使修复了语法,您仍然会 运行 遇到接管默认 Electron 菜单及其键绑定的问题。你是说你要添加你自己的自定义菜单和键绑定,如果这是你的目标那么在生产中很好,但听起来你已经失去了你想要维护的功能。
你可以这样修复它:
const menuTemplate = [
{
label: 'File',
submenu: [{ label: 'New Todo' }]
}
];
看来 electron Menu 和 MenuItem 对象设置为不可变的。
这意味着如果你想修改它们,你必须创建新对象并使用它。这就是我的代码为此所做的,隐藏帮助菜单和开发人员工具:
// main.js
function createWindow () {
// Create the browser window.
mainWindow = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
preload: path.join(__dirname, 'preload.js')
}
})
...
let defaultMenu = Menu.getApplicationMenu()
let newMenu = new Menu();
defaultMenu.items
.filter(x => x.role != 'help')
.forEach(x => {
if(x.role == 'viewmenu' && process.env.NODE_ENV == 'production') {
let newSubmenu = new Menu();
x.submenu.items.filter(y => y.role != 'toggledevtools').forEach(y => newSubmenu.append(y));
x.submenu = newSubmenu;
newMenu.append(
new MenuItem({
type: x.type,
label: x.label,
submenu: newSubmenu
})
);
} else {
newMenu.append(x);
}
})
Menu.setApplicationMenu(newMenu);
...
})
}
app.on('ready', createWindow)
Electron 应用程序打开时使用的默认菜单与 electron-quick-start 示例应用程序中出现的默认菜单相同,如何更改它?
还尝试了 menu example on the docs 但没有任何变化。
当我用 mainWindow.setMenu(null);
隐藏菜单时,菜单消失了,但仍然无法初始化新菜单
有什么想法吗?
平台:windows7
电子版:0.36.4
参考文件:
package.json:
{
"name": "electric_timer",
"version": "0.1.0",
"description": "a Time sheet & project managment",
"main": "app.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",
"url": "none"
},
"author": "Eyal Ron",
"license": "MIT"
}
app.js:
var app = require('app');
var BrowserWindow = require('browser-window');
app.on('ready', function (){
var mainWindow = new BrowserWindow({
width: 800,
height: 600
});
mainWindow.setMenu(null);
mainWindow.loadUrl('file://' + __dirname + '/main.html');
});
main.js:
var remote = require('remote');
var Menu = remote.require('menu');
var menu = Menu.buildFromTemplate([
{
label: 'Electron',
submenu: [
{
label: 'Prefs',
click: function(){
alert('hello menu');
}
}
]
}
]);
Menu.setApplicationMenu(menu);
main.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>electron test</title>
</head>
<body>
<h1>hello world</h1>
<script>requier('./main.js')</script>
</body>
</html>
电子的'default_app'sets the menu;如果你想避免这种情况,你需要 Electron 直接启动你的应用程序,而不是通过默认应用程序(注意:如果你使用类似 electron .
的东西启动你的应用程序,你实际上启动了默认应用程序)。
Electron looks in its resource folder 用于 'app'、'app.asar' 或 'default_app',因此要直接启动您的应用,您需要复制或 link进入 Electron 的资源文件夹。
无论您如何启动您的应用程序,您都可以使用 Menu.setApplicationMenu 设置您的菜单——您可以在主进程中执行此操作,您不需要像示例中那样在渲染器中执行此操作.顺便说一下,您的 main.html 中有一个拼写错误(requier 而不是 require),因此如果这是您的实际代码,则表明您的 main.js 根本没有 运行。
将自定义菜单的逻辑放入 app('ready') 事件回调。尝试以下代码示例
const {app, BrowserWindow, Menu} = require('electron');
let mainWindow;
let menuTemplate = [
{
label: "Window Manager",
submenu: [
{ label: "create New" }
]
},
{
label : "View",
submenu : [
{ role : "reload" },
{ label : "custom reload" }
]
}
];
function appInit () {
// Create the browser window.
mainWindow = new BrowserWindow({width: 800, height: 600})
// and load the main.html of the app.
mainWindow.loadFile('main.html')
let menu = Menu.buildFromTemplate(menuTemplate);
Menu.setApplicationMenu(menu);
}
app.on('ready', () => {
appInit();
})
Electron 在您的应用中在哪里?您的 package.json
文件应如下所示:
{
"name": "todos",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"electron": "electron ."
},
"author":
"Who Cares <email@example.com> (https://doesntmatter.com/)",
"license": "MIT",
"dependencies": {
"electron": "3.0.8"
}
}
您的 Electron 端将如下所示:
const electron = require('electron');
const { app, BrowserWindow, Menu } = electron;
let mainWindow;
app.on('ready', () => {
mainWindow = new BrowserWindow({});
mainWindow.loadURL(`file://${__dirname}/main.html`);
const mainMenu = Menu.buildFromTemplate(menuTemplate);
Menu.setApplicationMenu(mainMenu);
});
const menuTemplate = [
{
label: 'File'
}
];
即使修复了语法,您仍然会 运行 遇到接管默认 Electron 菜单及其键绑定的问题。你是说你要添加你自己的自定义菜单和键绑定,如果这是你的目标那么在生产中很好,但听起来你已经失去了你想要维护的功能。
你可以这样修复它:
const menuTemplate = [
{
label: 'File',
submenu: [{ label: 'New Todo' }]
}
];
看来 electron Menu 和 MenuItem 对象设置为不可变的。
这意味着如果你想修改它们,你必须创建新对象并使用它。这就是我的代码为此所做的,隐藏帮助菜单和开发人员工具:
// main.js
function createWindow () {
// Create the browser window.
mainWindow = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
preload: path.join(__dirname, 'preload.js')
}
})
...
let defaultMenu = Menu.getApplicationMenu()
let newMenu = new Menu();
defaultMenu.items
.filter(x => x.role != 'help')
.forEach(x => {
if(x.role == 'viewmenu' && process.env.NODE_ENV == 'production') {
let newSubmenu = new Menu();
x.submenu.items.filter(y => y.role != 'toggledevtools').forEach(y => newSubmenu.append(y));
x.submenu = newSubmenu;
newMenu.append(
new MenuItem({
type: x.type,
label: x.label,
submenu: newSubmenu
})
);
} else {
newMenu.append(x);
}
})
Menu.setApplicationMenu(newMenu);
...
})
}
app.on('ready', createWindow)