Windows Forms и проблема ShowDialog

У меня есть безграничное приложение Windows Forms.

Главное окно создает другие формы (простые диалоговые окна, где я могу нажать да или не) с ShowDialog(). Каждое созданное диалоговое окно не видимо в панели задач, мое приложение имеет только одну запись панели задач, которая фокусирует мое приложение (и если диалоговое окно открыто, что каждый фокусируется). Если я использую ALT + ВКЛАДКА для циклического повторения ко всем открытым окнам, я только вижу одну запись, также.

Однако, если диалоговое окно создается, в то время как мое приложение не имеет фокуса (например, пользователь запускает длительную задачу, начинает работать над чем-то еще и будучи в фоновом режиме, мое приложение показывает диалоговую "Задачу, сделанную..."), и я хочу вернуться к своему приложению, вещи становятся странными.

  • Если я нажимаю на панель задач, чтобы сфокусировать мое приложение, главное окно фокусируется (не диалоговое окно).
  • Я не могу использовать главное окно (потому что существует все еще открытое модальное диалоговое окно).
  • Windows 7 ALT + предварительный просмотр ВКЛАДКИ показывает Диалоговое окно, в то время как предварительный просмотр наведения мыши панели задач показывает главное окно (в нормальном поведении оба, показывают диалоговое окно перед главным окном).
  • Единственный способ подать мою заявку, применимую снова, к ALT + ВКЛАДКА к записи, и закройте модальное диалоговое окно.
  • Если я использую ALT + ВКЛАДКА, только диалоговое окно выявлено, и главное окно все еще в фоновом режиме.

Существует ли способ предотвратить это? Я знаю, что сделать, но большинство клиентов думает приложение, разрушенное, так как главное окно не отвечает.

Обновление:

Решение состоит в том, чтобы передать высокоуровневое окно ShowDialog() метод (в большинстве случаев и, если бы используется в форме, которая была бы "этим").

Так как я не сделал требуемый для рефакторинга моего всего кода, и все мои формы наследовались "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

однажды. Это помогло мне половина дня, осуществив рефакторинг ;)

6
задан Peter Mortensen 19 November 2010 в 11:11
поделиться

1 ответ

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

4
ответ дан 17 December 2019 в 07:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: