2010-02-04 20 views
8

Я искал вверх и вниз в Интернете и, к сожалению, никогда не сталкивался с вопросом совсем как у меня, так что здесь идет:C#, WPF - OpenFileDialog не появляется

Мой C# WPF приложение не будет показывать мне не 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(); 

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

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

+4

В качестве отправной точки для тех, кто отвечает, это выглядит как «Microsoft.Win32.OpenFileDialog», а не эквивалент 'System.Windows.Forms.OpenFileDialog'. –

+0

Да, это правильно. Спасибо за разъяснение! – Koarl

+0

Это старый вопрос, но я испытываю тот же феномен с надстройкой VSTO для Excel: «Иногда это работает, иногда это не так». Это совершенно непредсказуемо. К сожалению, ни эксперимент с потоками STA, ни создание (фиктивные) формы, ни окна WPF перед вызовом OpenFileDialog.ShowDialog() (как предложено ниже) не позволяют этого поведения. – bovender

ответ

7

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

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

+0

Спасибо за совет! К сожалению, несмотря на то, что, как вы указали, существует большое количество возможных режимов отказа, и отключить расширение сторонней оболочки не было тем, с которым я столкнулся. Даже после выключения и перезагрузки проблема сохраняется. Также позвольте мне отметить, что диалоги работают в другом проекте одновременно - безупречно. Хотелось бы проголосовать за вас, но, как мне кажется, мне очень полезно. К сожалению, я не могу этого сделать до тех пор, пока не соберу еще несколько комментариев: P – Koarl

6

Это произошло со мной в последнее время. Проблема заключалась в том, что метод 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(); 
} 

будет работать, как ожидалось.

+0

Говоря, что это заблокирует вас, значит, он не вернется? Потому что это явно не то, что происходит в моем конце. Напротив, он возвращается немедленно, показывая, что Dialog не был показан, но это происходит только в случайных случаях. – Koarl

+0

В приложении «Консоль» требуется работать с STAThread для диалога. –

+0

Но WPF отличается. И код, похоже, тоже работает на основном потоке. –

0

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

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

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) немедленно вернуться ложным, не показывая, потому что мое приложение не было окна для того, чтобы прикрепить к.

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

+0

Это не проблема с моим приложением, так как гарантировано наличие окна при создании диалога. Пользователь должен нажать кнопку, чтобы она отображалась, поэтому ** имеет ** окно. Или я неправильно понял ваш ответ? – Koarl

0

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

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

1

У меня возникла аналогичная проблема, и, как предложил Гарретт, это проблема 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(); 
     } 
    } 

Unforunately, он не работает для меня, чтобы просто пометить метод как STAThread, я должен был начать работу в потоке, помеченный как STA.

+0

Это именно то, что помогло мне, спасибо! И да, просто отметить метод с свойством STAThread было недостаточно. – user2134488

1

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

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

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

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

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

Смежные вопросы