代码之家  ›  专栏  ›  技术社区  ›  Andrew J. Brehm

使用多个默认按钮从PowerShell调用MessageBox.Show()?

  •  4
  • Andrew J. Brehm  · 技术社区  · 15 年前

    我试图显示PowerShell中带有“是”和“否”按钮的消息框。

    我可以用“确定”按钮显示一个消息框:

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

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

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

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

    show(string、string、message box buttons)显示具有指定文本、标题和按钮的消息框。

    所以很自然(?)我决定称之为:

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

    这会导致一个错误:

    找不到“show”和参数计数“3”的重载。

    但是对于接受三个参数的“show”,有一个过载!

    我做错什么了?

    (有人能告诉我为什么在PowerShell中调用方法通常是通过使用点语法:object.method()来完成的,但对于MessageBox类需要“::”?这太令人困惑了。)

    2 回复  |  直到 15 年前
        1
  •  5
  •   Cédric Rup    15 年前

    正确的方法是

    $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语言

    编辑---

    使用PowerShell为枚举生成的隐式强制转换的Keith解决方案更优雅。 它不适用于我仍然使用的PS v2 CTP 3,但在RTM版本上工作正常。 完整的解释是值得的,尽管…

        2
  •  5
  •   Keith Hill    15 年前

    尝试这种方式:

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

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

    推荐文章