Why does a folder dialog immediately close unless a window is displayed in WPF?

别说谁变了你拦得住时间么 提交于 2019-12-24 10:55:37

问题


I'm developing a WPF application that's meant to live in the tool tray, so it doesn't involve any windows. Right-clicking the tool tray icon brings up a menu with a Configure Report Path... option, and I'd like to display a folder browser dialog to the user when this is clicked:

What I'm finding is that when the option is selected, a dialog opens and immediately closes unless I assign some window to Application.Current.MainWindow and show it before opening the dialog. This is the code I'm using:

public CounterIconViewModel(IMessenger messenger)
{
    void ConfigureReportPath()
    {
        // Application window must be created and displayed.
        Application.Current.MainWindow = new Window();
        Application.Current.MainWindow.Show();

        var browseDialog = new VistaFolderBrowserDialog { ShowNewFolderButton = false };

        if (browseDialog.ShowDialog() != true)
        {
            return;
        }

        // (Separate issue) Command doesn't execute unless I comment out the line below.
        //messenger.Send(browseDialog.SelectedPath, "ReportPath");
    }

    ConfigureReportPathCommand = new RelayCommand(ConfigureReportPath);
    ExitApplicationCommand = new RelayCommand(Application.Current.Shutdown);
}

In this case I'm using VistaFolderBrowserDialog from Ookii.Dialogs.Wpf, but I've tried the same thing with another WPF browser dialog and notice identical behaviour.

Is there a reason why a browser dialog seems to require a window to be displayed to remain open, and any workarounds?

Update

I've found that if I initialize and pass an instance of Window to browseDialog.ShowDialog, the dialog remains open without me having to assign the main application window and display it:

if (browseDialog.ShowDialog(new Window()) != true)

I don't understand why this works. I'll post this as an answer if no others appear so that at least people in a similar situation are aware of this workaround.

Update 2

The other dialog I tested it with was CommonOpenFileDialog from Microsoft.WindowsApiCodePack-Shell:

var browseDialog = new CommonOpenFileDialog { IsFolderPicker = true };
browseDialog.ShowDialog();

My tool tray icon displays a rich tool-tip (a custom UserControl) if I hover over it, and with this browser dialog I found that:

  • If I hover over the icon to make the tool-tip display, then the browser dialog works fine when I try to open it on the first and every subsequent attempt.
  • If I try to open the browser dialog before displaying the tool-tip display, the browser dialog opens and closes immediately on the first try, but then remains open on every subsequent attempt.

This dialog also accepts a Window instance in ShowDialog but it makes no difference if I pass one or not.

My workaround (initializing and passing a blank window to the Ookli dialog browser) seems to work fine regardless of whether I first bring up the tool-tip, so I'm sticking with that for the time being.

来源:https://stackoverflow.com/questions/49652633/why-does-a-folder-dialog-immediately-close-unless-a-window-is-displayed-in-wpf

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!