Проблема Windows Forms и ShowDialog - PullRequest
6 голосов
/ 27 мая 2010

У меня есть приложение 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

один раз. Мне пол дня помог рефакторинг;)

1 Ответ

4 голосов
/ 27 мая 2010

Вы пытались передать ссылку на главное окно на ShowDialog звонки?

// assuming this code is in the main form (so "this" refers to the main form)
DialogForm dialog = new DialogForm();
DialogResult result = dialog.ShowDialog(this);

Цитата из документации по этой перегрузке :

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

...