У меня есть приложение Windows Forms без полей.
Главное окно создает другие формы (простые диалоги, в которых я могу нажать да или нет) с помощью ShowDialog()
.
Каждое созданное диалоговое окно не отображается на панели задач, у моего приложения есть только одна запись на панели задач, которая фокусирует мое приложение (и если диалоговое окно открыто, оно фокусируется). Если я использую ALT + TAB для циклического перехода ко всем открытым окнам, я вижу только одну запись.
Однако, если диалоговое окно создано, когда мое приложение не имеет фокуса (например, пользователь запускает долго выполняющуюся задачу, начинает работать над чем-то другим и, находясь в фоновом режиме, мое приложение отображает диалоговое окно «Задача» готово ... ") и я хочу вернуться к своему заявлению, все становится странным.
- Если я щелкну панель задач, чтобы сфокусировать свое приложение, основное окно будет сфокусировано (не диалоговое окно).
- Я не могу использовать главное окно (потому что есть еще открытый модальный диалог).
- Windows 7 ALT + TAB Предварительный просмотр показывает диалог, в то время как предварительный просмотр панели задач при наведении курсора показывает главное окно (в обычном режиме оба показывают диалоговое окно перед главным окном).
- Единственный способ сделать мое приложение снова пригодным для использования - это ALT + TAB для ввода и закрытия модального диалога.
- Если я использую ALT + TAB , только диалоговое окно выводится на передний план, а главное окно остается на заднем плане.
Есть ли способ предотвратить это?
Я знаю, что делать, но большинство клиентов считают, что приложение зависло, так как главное окно не отвечает.
Обновление:
Решение состоит в том, чтобы передать окно верхнего уровня методу ShowDialog()
(в большинстве случаев и при использовании в форме, которая будет "this").
Поскольку я не хотел проводить рефакторинг всего своего кода, а все мои формы наследуются от «MyCustomFormBase», вот небольшое решение, которое работает очень хорошо.
Public Class MyCustomFormBase
Public Shared Property ApplicationMainForm() As Form
Get
Return _applicationMainform
End Get
Set(ByVal value As Form)
_applicationMainform = value
End Set
End Property
Private Shared _applicationMainform As Form
Public Shadows Function ShowDialog() As DialogResult
If MyCustomFormBase.ApplicationMainForm IsNot Nothing Then
Return MyBase.ShowDialog(MyCustomFormBase.ApplicationMainForm)
Else
Return MyBase.ShowDialog()
End If
End Function
Public Shadows Function ShowDialog(ByVal owner As IWin32Window) As DialogResult
Return MyBase.ShowDialog(owner)
End Function
End Class
В конструкторе главного окна я использую
MyCustomFormBase.ApplicationMainForm = Me
один раз. Мне пол дня помог рефакторинг;)