为什么关闭表单然后转到变量会导致我的Powershell崩溃?

时间:2019-07-11 21:35:13

标签: winforms powershell button

所以我有一个脚本,试图在其中创建文本菜单的GUI版本。我目前可以从文本菜单中选择启动GUI菜单。我希望有一个按钮返回到文本菜单,但是使窗体上的关闭按钮(“ x”)完全退出脚本。

我以为我可以使用Form.Close()关闭GUI,然后再调用文本菜单变量,但这会导致PowerShell会话崩溃。

这是我提到的嵌套在Add_Click脚本块中的代码:

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

我希望这将关闭GUI并返回到文本菜单,但结果却更具灾难性……任何人都知道为什么,或者也许我能完成我所描述的期望结果?任何建议都非常感谢!

2 个答案:

答案 0 :(得分:0)

Close可能有特殊含义,通常由Dispose方法调用。隐藏或隐藏可能是您所追求的,但是我需要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()

}

答案 1 :(得分:0)

  

当表单显示为模式对话框时,单击“关闭”按钮(该表单右上角带有X的按钮)将导致该表单被隐藏,并且DialogResult属性被设置为DialogResult。取消。与非模式形式不同,当用户单击对话框的关闭表单按钮或设置DialogResult属性的值时,.NET Framework不会调用Close方法。而是隐藏该窗体,并且可以在不创建对话框的新实例的情况下再次显示该窗体。因为显示为对话框的表单是隐藏的而不是关闭的,所以当应用程序不再需要该表单时,必须调用该表单的Dispose方法。

来自Form.ShowDialog Method

  

不将窗体放置在“关闭”上的两个条件是:(1)它是多文档界面(MDI)应用程序的一部分,并且该窗体不可见; (2)您已使用ShowDialog显示了表单。在这些情况下,您将需要手动调用Dispose来标记表单的所有控件以进行垃圾收集。

来自Form.Close Method

  

如果使用Show方法显示表单,将自动调用Dispose。如果使用了ShowDialog之类的其他方法,或者根本没有显示该窗体,则必须在应用程序中调用Dispose。

来自Form.Dispose(Boolean) Method

但是:

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