天天看點

electron實作子視窗中建立右鍵菜單

作者:中二少年學程式設計

後續可能會用electron開發一些工具,包括不限于快速生成個人小程式、開發輔助學習的互動式軟體、幫助運維同學一鍵部署的簡易版CICD工具等等。

開發進度,取決于我懶惰的程度。

不過不嫌棄的同學還是可以先關注一波小程式——中二少年工具箱,真的釋出工具了,肯定還是需要一個統一下載下傳入口的,各個部落格平台有點不太合适。

前言

有位同學問到一個問題,大緻意思就是他建立了子視窗,但是子視窗的右鍵菜單沒有生效,如圖:

electron實作子視窗中建立右鍵菜單

他的代碼大緻看了下,雖然沒找到

webContents.on('context-menu', (e, params) => {
          contextMenu.popup()
        })           

但是代碼裡有contextMenu.popup(),應該是在某個地方做了監聽吧。

因為沒有完整代碼,我沒辦法明确告訴同學具體哪裡做錯了,但我可以把正确寫法釋出出來,免得一直在評論區長篇對話。

一、右鍵菜單建立

右鍵菜單的建立大緻分為這麼幾步:

  1. 建立一個視窗,這是放右鍵菜單的容器:
let win=new BrowserWindow(options)           

BrowserWindow是electron提供的對象,可自行查閱。

  1. 建立右鍵菜單:
//    建立右鍵菜單
        let contextMenu = Menu.buildFromTemplate([
            {label: 'Item 1' || test,role:'reload'},
            {role: 'editMenu'}
        ])           

Menu同樣是electron提供的對象。

  1. 把第二步建立的菜單放到第一步建立的視窗:
win.webContents.on('context-menu', (e, params) => {
          contextMenu.popup()
        })           

webContents是BrowserWindow的一個屬性,執行個體化後可以調用。

二、為子視窗建立右鍵菜單

通過上面章節,大家了解了如何建立右鍵菜單,我們會發現一個規律,那就是我們為某個視窗挂載了對應的右鍵菜單,這是對應關系。

那麼如果建立子視窗,如何為子視窗建立右鍵菜單呢?

其實很簡單,就是重複一遍上面的操作。

我自己demo裡面封裝解耦有點多,如果不通讀項目,可能會增加了解成本,是以這裡就參考主視窗菜單實作,複制粘貼實作子視窗菜單了,這種屎山代碼前身,希望不要影響看到的同學。

對應上面章節的步驟:

  1. 建立一個主視窗,然後再建立一個子視窗:
let win=new BrowserWindow(options)
    let child = new BrowserWindow({ parent: this.win , modal: true,})
    child.loadURL('https://baidu.com')           

2. 建立主視窗右鍵菜單,我又複制實作子視窗右鍵菜單:

//    建立主視窗右鍵菜單
        let contextMenu = Menu.buildFromTemplate([
            {label: 'Item 1' || test,role:'reload'},
            {role: 'editMenu'}
        ])
//    建立子視窗右鍵菜單
        let contextMenuTest = Menu.buildFromTemplate([
            {label: 'Item 2' || test,role:'reload'},
            {role: 'editMenu'}
        ])           

3. 把第二步建立的菜單放到第一步建立的視窗:

win.webContents.on('context-menu', (e, params) => {
          contextMenu.popup()
        })
child.webContents.on('context-menu', (e, params) => {
          contextMenuTest.popup()
        })           

注意:不要直接抄代碼,重點看思路。因為這就是屎山代碼,我在自己demo裡試驗通過後,會對某些封裝過的方法複制粘貼,會修改變量名,萬一哪多個空格,少個變量,别罵我。

最終效果:

electron實作子視窗中建立右鍵菜單
electron實作子視窗中建立右鍵菜單

2.一點小問題

因為這個視窗是主視窗的子視窗,是以這裡直接寫主視窗的show方法就可以,子視窗會自動顯示。

//等待dom渲染後打開視窗
        this.win.on('ready-to-show', () => {
            this.win.show()
        })           

如果哪天你的需求變得很複雜,可能會有各種層級,需要在很多地方控制不同視窗的show,那麼記得做好視窗是否存在的判斷,例如:

this.win.on('ready-to-show', () => {
            this.win.show()
            console.log('ccccccccccccccc',child)
            if(!child.isDestroyed()){
                child.show()
            }
        })           

child關閉後,對象不是null,是以必須通過它的isDestroyed方法判斷。

總結

大家有什麼問題也可以私信部落客,沒人問都懶得寫文章了。

繼續閱讀