Почему закрытие формы, а затем переход к переменной вызывает сбой моего PowerShell? - PullRequest
0 голосов
/ 12 июля 2019

Итак, у меня есть скрипт, в котором я пытаюсь создать версию текстового меню с графическим интерфейсом.В настоящее время у меня есть опция из текстового меню для запуска меню с графическим интерфейсом.Я хочу, чтобы кнопка вернулась в текстовое меню, но кнопка закрытия («x») в форме полностью закрывает скрипт.

Я подумал, что могу просто закрыть GUI с помощью Form.Close(), а затем вызвать мою переменную текстового меню, но это приводит к сбою моего сеанса PowerShell.

Вот код, который я упомянул, вложенный вAdd_Click scriptblock:

$Text_Menu.Add_Click({
    $MainMenu_GUI.Close()
        .$MainMenu
    })

Я надеялся, что это закроет графический интерфейс и просто вернется в текстовое меню, но вместо этого у него будет гораздо более катастрофический результат ... Кто-нибудь знает почему, или, может быть, как я могувыполнить то, что я описал желаемый результат быть?Любой совет очень ценится!

Ответы [ 2 ]

0 голосов
/ 12 июля 2019

Когда форма отображается в виде модального диалогового окна, нажатие кнопки «Закрыть» (кнопка с крестиком в правом верхнем углу формы) приводит к тому, что форма скрывается, а для свойства DialogResult устанавливается значение DialogResult. Отменить. В отличие от немодальных форм, метод Close не вызывается .NET Framework, когда пользователь нажимает кнопку закрытия формы диалогового окна или задает значение свойства DialogResult. Вместо этого форма скрыта и может быть показана снова без создания нового экземпляра диалогового окна. Поскольку форма, отображаемая в виде диалогового окна, скрыта, а не закрыта, необходимо вызвать метод Dispose формы, когда форма больше не нужна вашему приложению.

из Form.ShowDialog Method

Два условия, когда форма не расположена при закрытии, это когда (1) она является частью приложения с интерфейсом с несколькими документами (MDI), а форма не отображается; и (2) вы отобразили форму, используя ShowDialog. В этих случаях вам нужно будет вызвать Dispose вручную, чтобы пометить все элементы управления формы для сбора мусора.

из Форма. Закрытый метод

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

из Form.Dispose (Boolean) Метод

Тем не менее:

Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
$form = New-Object System.Windows.Forms.Form 
$form.Size = New-Object System.Drawing.Size(150,150) 

$Button = New-Object System.Windows.Forms.Button
$Button.Location = New-Object System.Drawing.Point(10,10)
$Button.Size = New-Object System.Drawing.Size(50,50)
$Button.Text = "Close"
$Button.add_click({$form.close()})

$form.Controls.Add($Button)
$form.ShowDialog()

У меня просто отлично работает ...
Проблема должна быть в $MainMenu

0 голосов
/ 12 июля 2019

Close, вероятно, имеет особое значение и обычно вызывается методом Dispose .Возможно, вы ищете Hide или Hidden, но мне нужно mvce , чтобы быть уверенным.

try {
    $Text_Menu = # MISSING CODE THAT CREATES SOME OBJECT
    # Source example https://www.business.com/articles/powershell-interactive-menu/
    $Text_Menu.Add_Click({ return }) 
} finally { 
    $MainMenu_GUI.Dispose()

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...