C #, WPF - OpenFileDialog не появляется - PullRequest
8 голосов
/ 04 февраля 2010

Я искал вверх и вниз по сети и, к сожалению, никогда не сталкивался с такой проблемой, как у меня, так что вот так:

Мое WPF-приложение на C # не отображает мне OpenFileDialogs или SafeFileDialogs.

private void btnBrowseNet_Click(object sender, RoutedEventArgs e)
    {
        OpenFileDialog ofd = new OpenFileDialog();
        ofd.CheckPathExists = true;
        ofd.Multiselect = false;
        ofd.Title = "Open Network Configuration Batch file...";
        ofd.ValidateNames = true;
        ofd.Filter = "Comma Seperated Value Files|*.csv";

        if (ofd.ShowDialog() == true)
        {
           //...
        }
    }

Этот точный код в одном случае делает именно то, что должен, и едва ли через пять минут я могу нажать на кнопку все, что захочу, ничего не происходит, кроме указателя мыши, превращающегося в маленький индикатор занятости, а затем ничего. Я могу пройти через метод или сделать что-то вроде этого

bool? shown = ofd.ShowDialog();

Но несмотря ни на что, диалог не будет отображаться. Конечно, показанное будет ложным в этом случае. Я потратил полтора часа на поиски вчера, а когда ушел, попробовал еще раз, и внезапно это сработало. Иногда это работает, иногда нет. Но, похоже, это зависит от проекта, потому что я могу вставить тот же код в новый проект, и он работает так, как должен. Кроме того, это единственная вещь в проекте, которая кажется подозрительной. Все остальное работает как задумано.

Кто-нибудь здесь когда-либо испытывал нечто подобное и, таким образом, представление о том, что на земле я мог бы сделать? Мы будем очень признательны за любую помощь.

Ответы [ 7 ]

8 голосов
/ 04 февраля 2010

Существует большое количество возможных режимов отказа для OpenFileDialog. Использование одного предоставляет вашему приложению практически любое расширение оболочки, установленное на вашем компьютере. Многие из них могут быть очень дестабилизирующими, вряд ли автор расширения проверял, правильно ли он работает в процессе WPF.

Решите эту проблему, запустив утилиту автозапуска SysInternals. Перейдите на вкладку «Обозреватель» и найдите группы, в названии которых есть «ShellEx». Снимите все, что не было опубликовано Microsoft. Перезагрузитесь и проверьте, решена ли проблема.

6 голосов
/ 16 сентября 2011

Это случилось со мной недавно. Проблема заключалась в том, что метод Main не был помечен как STAThread, что приведет к бесконечной блокировке метода ShowDialog WPF OpenFileDialog.

static void Main(string[] args)
{
    var openFileDialog = new OpenFileDialog();
    var result = openFileDialog.ShowDialog();
}

никогда не выйдет или не выдаст исключение, тогда как

[STAThread]    
static void Main(string[] args)
{
    var openFileDialog = new OpenFileDialog();
    var result = openFileDialog.ShowDialog();
}

будет работать как положено.

2 голосов
/ 28 апреля 2016

У меня похожая проблема, и, как предположил Гарретт, это проблема STA. В последние несколько месяцев я много боролся с проблемами STA, так как мне нужно запускать экраны из окна консоли (в целях тестирования) - это означает, что вызывающий поток не является STA, но его можно смоделировать следующим образом:

    [STAThread]
    private void Execute() {
        try {
            Thread t = new Thread(() => {
                OpenFileDialog dlg = new OpenFileDialog();
                // The following would not return the dialog if the current
                // thread is not STA
                var result = dlg.ShowDialog();
            });

            t.SetApartmentState(ApartmentState.STA);
            t.Start();
        } catch (Exception ex) {
            // Handle the exception
            ex.LogException();
        }
    }

К сожалению, у меня не получилось просто пометить метод как STAThread, мне пришлось запустить операцию в потоке, помеченном как STA.

1 голос
/ 02 марта 2017

Я знаю, что этот вопрос был задан в 2010 году, и прямой ответ был не тот, который я дам, но, поскольку на сегодняшний день есть другая причина, чтобы эта проблема возникла.

Я недавно установил свое программное обеспечение на новую виртуальную машину, которая отлично работает на моем компьютере разработчика и многих других машинах для тестирования.

Виртуальная машина Windows 7 была слишком свежа и не имела установленного SP1 KB976932 .

После установки я мог бы использовать диалоги открытия файла сохранения песка.

Надеюсь, это поможет кому-то еще.

0 голосов
/ 30 марта 2018

иногда [staThread] не работает, вы можете попробовать это:

    public void showOpenFileDialog()
    {
        OpenFileDialog im = new OpenFileDialog();
        if (im.ShowDialog() == DialogResult.OK)
        {
            textBox1.Text = im.FileName;
        }
    }


    private void select_button_Click(object sender, EventArgs e)
    {
        Thread newThread = new Thread(new ThreadStart(showOpenFileDialog));
        newThread.SetApartmentState(ApartmentState.STA);
        newThread.Start();
    }
0 голосов
/ 11 сентября 2012

В консольном приложении вам потребуется приложение STAThread, чтобы оно работало. Но WPF отличается.

Я бы посоветовал вам использовать диалоги файлов только после запуска окна и начала работы основного потока. Попробуйте показать свой диалог в каком-то событии MainWindow его жизненного цикла.

0 голосов
/ 20 сентября 2011

Не уверен, что вы поняли это или нет, но у меня недавно была такая же проблема. В моем случае проблема заключалась в том, что мое приложение не установило существующее окно.

Мой код выглядел примерно так.

private void Application_Startup(object sender, StartupEventArgs e) {
    string startupFileName = String.Empty();
    if ( startupMode = StartupMode.Load ) {
        // open existing file
        OpenFileDialog openDlg = new OpenFileDialog();
        if (openDlg.ShowDialog() != true)
             return;
        startupFileName = openDlg.FileName;
    } else {
        // create a new file
        SaveFileDialog saveDlg = new SaveFileDialog();
        if (saveDlg.ShowDialog() != true)
             return;
        startupFileName = saveDlg.FileName;
    }

    // show my main application window
    MainWindow myMainWindow = new MainWindow(startupFileName);
    myMainWindow.Show();
}

OpenFileDialog (или SaveFileDialog) немедленно возвращал бы false, не показывая, потому что у моего приложения не было окна, к которому он мог присоединиться.

Мое решение состояло в том, чтобы поместить код открытия / сохранения после того, как я создал главное окно, но до того, как я вызвал метод Show ().

...