打开时如何制作对话框以阻止BrowserWindow?

时间:2019-08-07 18:19:19

标签: electron

我致电dialog.showOpenDialog()来找到文件夹的路径。但是问题在于,这不会阻止mainWindow。有必要在显示标准路径选择GUI时,程序仅在完成路径选择后 继续工作。搜索并意识到您需要使用remote。但是什么也没发生。

我得到:

  

无法解构“未定义”或“空”的属性对话框。   如果来自electronic.remote,则显示对话框。

我尝试了很多不同的事情(这些并不是全部尝试,只是我记得的事情):

const { dialog } = require ('electron').remote;

var remote = electron.remote;

var dialog = remote.dialog;

const dialog = require ('electron').remote.dialog;

我尝试了很多次连接。

我的main.js:

const url = require('url');
const path = require('path');

const {dialog} = electron.remote;

const {app, BrowserWindow, Menu} = electron;

app.on('ready', function () {
    const {start_width, start_height} = electron.screen.getPrimaryDisplay().workAreaSize;
    mainWindow = new BrowserWindow({
        minWidth: 1250,
        minHeight: 800,
        height: start_height,
        width: start_width,
        center: true,
        show: false,
    });

    mainWindow.loadURL(url.format({
        pathname: path.join(__dirname, 'templates/mainWindow.html'),
        protocol: 'file:',
        slashes: true
    }));

    mainWindow.on('closed', function () {
        app.quit();
    });
    // mainWindow.webContents.openDevTools();
    const mainMenu = Menu.buildFromTemplate(mainMenuTemplate);
    Menu.setApplicationMenu(mainMenu);
    mainWindow.maximize();
    mainWindow.show();
});

function createAddWindow() {
    addWindow = new BrowserWindow({
        width: 300,
        height: 200,
        title: 'Add item'
    });

    addWindow.loadURL(url.format({
        pathname: path.join(__dirname, 'templates/addWindow.html'),
        protocol: 'file:',
        slashes: true
    }));
    addWindow.on('close', function () {
        addWindow = null;
    })
}

const mainMenuTemplate = [
    {
        label: 'Analysis',
        submenu: [{
            label: 'Global search',
            accelerator: 'Ctrl+O',
            click() {
                var path = createAddWindow();
                console.log(path);
            }

        },
            {
                label: 'Search for a year',
                accelerator: 'Ctrl+Alt+O',
                click() {
                    console.log(folderSelect());//i need console.log (like the whole program) to continue to work after folderSelect returns some value.
                }
            },
            {
                label: 'Quit',
                accelerator: process.platform == 'darwin' ? 'Command+Q' : 'Ctrl+Q',
                click() {
                    app.quit();
                }
            },
        ]
    }
];

function folderSelect() {
    dialog.showOpenDialog({properties: ['openDirectory']}, function (path) {
        console.log(path[0]);
        if (path === undefined) {
            return 'error';
        }
        else{
            return path[0];
        }
    });
}

console.log返回一些值之后,我需要folderSelect(像整个程序一样)才能继续工作。

例如,如果我调用了folderSelect函数,则在选择窗口后的文件夹关闭之前,您将无法与该程序进行交互。

我在SO上看到了很多类似的问题,但是无论我什么都不做。

1 个答案:

答案 0 :(得分:2)

为了阻止主窗口,您需要将BrowserWindow对象作为第一个可选参数传递给dialog.showOpenDialog方法,您要将该对话框附加到(我猜你是mainWindow )。

引用the docs

  

dialog.showOpenDialog([browserWindow,]选项)

     

browserWindow参数允许对话框将自身附加到   父窗口,使其成为模式窗口。

现在,如何实现它是完全不同的事情。可以通过多种方式完成此操作,但是如果您希望从renderer过程中调用对话框,则最简单的对话框如下所示:

import { remote } from 'electron'

remote.dialog.showOpenDialog(
  remote.getCurrentWindow(), // <- notice this one
  { properties: ['openDirectory'] }
).then(result => {
  // prefer promised API
})

要使整体正常工作的 关键 部分是在nodeIntegration选项中启用BrowserWindow,具体取决于版本的您正在使用的电子,您可能有也可能没有(它们已将version 4 中的默认值从true切换为false )。无论如何,最好从现在开始对其进行显式设置。因此,这通常就是现在开始mainwindow的方式:

mainWindow = new BrowserWindow({
  // ...
  show: false,
  webPreferences: {
    nodeIntegration: true // <- this one
  }
});