使用超过默认按钮从PowerShell调用Messagebox.Show()?

时间:2010-01-13 14:57:01

标签: winforms powershell

我正在尝试使用是和否按钮显示来自PowerShell的消息框。

我可以使用OK按钮显示一个消息框:

[system.windows.forms.messagebox]::show("Hello, world!")

我可以用我想要的按钮创建一个变量$按钮:

$buttons=[system.windows.forms.messageboxbuttons].yesno

我可以看到Show()静态方法被重载,其中一个选项是给出三个参数:

Show(String,String,MessageBoxButtons)显示带有指定文本,标题和按钮的消息框。

很自然地(?)我决定这样称呼:

[system.windows.forms.messagebox]::show("Are you sure?","",$buttons)

这会导致错误:

找不到“显示”和参数计数的重载:“3”。

但是“Show”有一个超载接受三个参数!

我做错了什么?

(并且有人可以告诉我为什么在PowerShell中调用方法通常使用点语法:object.method(),但MessageBox类需要“::”?这令人困惑。)

2 个答案:

答案 0 :(得分:5)

尝试这种方式:

[windows.forms.messagebox]::show('body','title','YesNo')

使用::.之间的区别是静态方法与实例方法。请注意,我们没有创建MessageBox对象。我们只是在MessageBox上使用::语法的静态方法。

答案 1 :(得分:5)

这样做的正确方法可以是

$buttons=[system.windows.forms.messageboxbuttons]::yesno;
[system.windows.forms.messagebox]::Show("Are you sure?","",$buttons);

注意“::”而不是“。”在第一行。 YesNo值是在System.Windows.Forms.Messageboxbuttons上静态定义的,因此您必须使用“::”(静态调用)而不是“。”

请注意,“[system.windows.forms.messageboxbuttons] .yesno”是尝试在System.Type的实例上调用“YesNo”属性,该实例不存在,因此导致$ null

希望它有所帮助!

和Cédric

编辑---

使用powershell为枚举制作的隐式转换的Keith解决方案更优雅。 它只适用于我仍在使用的PS V2 CTP 3,但在RTM版本上运行良好。 完整的解释值得给予,但是......