2016-11-04 2 views
0

У меня есть приложение C#, у которого есть значок в системном трее. Когда пользователь щелкнет правой кнопкой мыши, он отобразит меню.Почему OpenFileDialog не открывается?

  1. открыть файл
  2. выход

Когда пользователь щелкает 1. open file, он будет показывать (ShowDialog) форму с двумя кнопками

  1. открыт файл
  2. близко

Когда пользователь щелкает 1. open file, он будет делать

OpenFileDialog openFile = new OpenFileDialog(); 
openFile.Filter = "All files (*.*)|*.*"; 
DialogResult result = openFile.ShowDialog(); // deadlock here 
if (result == DialogResult.OK){ 
    // do some thing 
} 

В строке 3 приложения тупики

  1. Пользователь не может взаимодействовать с формой, он не отвечает
  2. OpenFileDialog не показывает

Не могли бы вы объяснить причину возникновения этой проблемы?

Update Ответ

  1. Форма, которую создают иконку в системном трее вызывается из другого потока.
  2. Я установил: thread.SetApartmentState(ApartmentState.STA);, OpenFileDialog покажет.
+2

При открытии модального диалога, такого как OpenFileDialog, это нормально, что вы не можете взаимодействовать с родительской формой. Или вы говорите, что OpenFileDialog с именем openFile, который замораживается? – Steve

+0

@Steve при показе OpenFileDialog пользователь не может взаимодействовать с формой, которая называется OpenFileDialog. И OpenFileDialog НЕ показывает. – GSP

+2

Диалоговое окно MODAL по дизайну MODAL. Он блокирует все в цепочке форм до вызова. См. Http://stackoverflow.com/questions/2834799/winforms-programming-modal-and-non-modal-forms-problem. Если вы находитесь в точке своего кода, где вам нужен ввод файла для вашего пользователя, тогда есть нет смысла продолжать свой код без этого файла. – Steve

ответ

-2
openFile.ShowDialog(); 

означает, что будет открыто модальным окно для текущей формы (форм, где создано диалоговое окно)

+0

Это даже близко к ответу, который исправит проблему OP –

+0

http://stackoverflow.com/questions/ 478476/c-sharp-openfiledialog-non-modal-возможно прочитать это и попытаться понять. – mojo

-2

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

+0

Открытие диалога из отдельного потока? Почему? – Pikoh

+0

Потому что тогда он не будет блокировать приложение от продолжения. –

+0

Ну, сначала из все, что я ожидал бы, когда приложение будет заблокировано, когда будет показан fileopendialog, это нормальное поведение. Во-вторых, если вы не хотите, чтобы диалог блокировал его, как насчет использования 'Show' вместо' S howDialog'? – Pikoh

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