2017-12-11 113 views
0

標準のネイティブアプリケーションと同様に、私の電子アプリケーションは、ライブ使用結果に基づいていくつかのメニュー項目のステータス(有効/無効)を変更する必要があります。Electronのメニュー項目のステータスを動的に変更する

私はmain.jsに私のメニューを設定しています:

function createWindow() { 
... 
... 
    require('./menu/mainmenu'); 
} 

のMenuItem私はMAINMENUに定義されている変更する必要があります。

{ label: "Show Colors", 
     accelerator: 'CmdOrCtrl+1', 
     enabled: getStatus(), 
     click() {getWebviewWebContents().send('switchToColors');} 
}, 

getStatus()falseまたはtrueを返す関数です。

これはElectronでは動作しません。メニューはアプリケーションの開始時に作成され、まったく変更できないためです。ダイナミックなメニュー項目が非常に一般的なので(メニューチェックボックス、有効/無効など)、これは深刻な欠点と考えています。

これに対応する方法はありますか?

答えて

0

私はメニュー項目にIDを設定することで、これを修正して、

{ label: "Show Colors", 
     id: 'color-scale', 
     accelerator: 'CmdOrCtrl+1', 
     enabled: getStatus(), 
     click() {getWebviewWebContents().send('switchToColors');} 
}, 

としてメニューアイテムを取得:私は有効にする必要があるとき

myItem = menu.getMenuItemById('color-scale') 

は次に、/プログラムでそれを無効にし、私が使用しています:

myItem.enabled = true 

または

myItem.enabled = false 
0

私が気づいて使用する唯一の回避策は、menuitemが変更されるたびにメニュー全体を再構築することです。これは非常に人間工学に優しいものではありませんが、十分にうまく動作し、オーバーヘッドの原因にはなりません。

+0

これは私がすでに試したものですが、成功はありません。 メニューはキャッシュ内に何かを保持しているように見えますが、再構築するたびに同じです(有効にした変数をfalseからtrueに変更したとしても) –

+0

再構築後に毎回メニューを明示的に設定しましたか( 'setApplicationMenu' ) –

関連する問題