自訂選單列


不同平台對視窗選單有不同的意義,以下討論將顯示差異並提供最佳實務,以確保視窗選單在所有平台上都能正常運作。

建立並設定選單列

若要建立選單列,您只需要在建立選單時在選項中指定 type: 'menubar'

var your_menu = new nw.Menu({ type: 'menubar' });

並確保附加到選單列的每個項目都有子選單。選單列上只有一個一般純文字選單項目在大部分平台上都沒有意義。

var submenu = new nw.Menu();
submenu.append(new nw.MenuItem({ label: 'Item A' }));
submenu.append(new nw.MenuItem({ label: 'Item B' }));

// the menu item appended should have a submenu
your_menu.append(new nw.MenuItem({
  label: 'First Menu',
  submenu: submenu
}));

然後您可以透過設定視窗的 menu 屬性來設定視窗選單

nw.Window.get().menu = your_menu;

請參閱 MenuWindow 以取得 API 的詳細資料。

平台差異

Windows 和 Linux

在 Windows 和 Linux 上,選單列的行為完全相同。每個視窗可以有一個選單列,而且它們都位於標題列下方。

全螢幕/資訊亭模式中的選單列

在全螢幕或資訊亭模式中,選單列會顯示在 Windows 和 Linux 上視窗的頂端。將 win.menu 設定為 null 可以完全移除選單列。另請參閱 win.menu

Mac OS X

行為已變更

此功能的行為已自 0.13.0 起變更。請參閱 從 0.12 到 0.13 的移轉注意事項

在 Mac 上,一個應用程式只能有一個選單,稱為應用程式選單,不論應用程式有多少個視窗。而且很多鍵盤快速鍵都仰賴應用程式選單的存在,例如 結束關閉複製

預設情況下,NW.js 應用程式會以預設選單啟動,包括 您的應用程式名稱編輯視窗。您可以使用 menu.createMacBuiltin 方法取得預設選單,並依需要自訂它

var mb = new nw.Menu({type:"menubar"});
mb.createMacBuiltin("your-app-name");
// append, insert or delete items of `mb` to customize your own menu
// then ...
nw.Window.get().menu = mb;

修正應用程式選單的標題

應用程式選單的第一個項目顯示 nwjs,而不是 您的應用程式名稱。若要修正它,您需要將 nwjs.app/Contents/Resources/*.lproj/InfoPlist.strings 中所有檔案的 CFBundleName 值設定為 您的應用程式名稱,而不是 nwjs

最佳實務

如上所述,在 Windows 和 Linux 上每個視窗都可以有一個選單列,而 Mac 上一個應用程式只能有一個應用程式選單。因此,一般來說,您應該只為您的主視窗設定選單,並避免在有多個主視窗時使用視窗選單。

而且,您可能會想要為不同的平台設計不同的選單,那麼您可以使用 process.platform 來取得您所在的平台。