У меня есть безграничное приложение Windows Forms.
Главное окно создает другие формы (простые диалоговые окна, где я могу нажать да или не) с ShowDialog()
. Каждое созданное диалоговое окно не видимо в панели задач, мое приложение имеет только одну запись панели задач, которая фокусирует мое приложение (и если диалоговое окно открыто, что каждый фокусируется). Если я использую 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
однажды. Это помогло мне половина дня, осуществив рефакторинг ;)
Вы пытались передать ссылку на главное окно для вызовов 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 позволяет указать конкретную форму или элемент управления, которому будет принадлежать диалоговое окно поле, которое показано. Если вы используете версия этого метода, не имеющая параметры, диалоговое окно отображается будет автоматически принадлежать текущее активное окно вашего заявление.