使用WPK for PowerShell GUI

时间:2011-03-09 21:58:29

标签: user-interface powershell

我们已经创建了一些出色的PowerShell脚本。但随着时间的推移,我们已经将脚本提供给非程序员。所以我们决定是时候为PowerShell提供一个简单易懂的GUI。

我看过James Brundage的9频道视频。他的视频在解释窗口,堆栈面板,文档面板,网格,标签和文本框方面做得很好。 但总共有60多个控件。不知道WPF没有帮助。

我想做的是能够做到以下几点:

文字输入
下拉列表
RadioButton集团
复选框组

我想出了一个例子,前三个但是有bug 无线电控制可视地显示所选的第一个按钮,但是当我拉出该组的值时,它是不正确的。

我找不到Checkbox的例子。

任何提示都将不胜感激。

以下是我在PowerShell中对WPK的测试:

function TestGui {
    Import-Module WPK

    $SelectedRadio = "First"

    New-Window -Title "Test User Input" -WindowStartupLocation CenterScreen `
      -Width 400 -Height 300 -Show {

      New-Grid -Rows 32*, 32*, 32*, 32* -Columns 100, 1* {

        #create style to use on controls
        $createLblStyle = @{
            Margin = 5
            HorizontalAlignment = "right"
            VerticalAlignment = "center"
        } 

        #Label Text for this row
        New-TextBlock -Text "Pick fruit" `
          -Row 0 -Column 0 @createLblStyle

        # dropdown ( combo box)
        New-ComboBox -Name FruitList `
          -row 0 -column 1 @createLblStyle `
          -Items { "Apple", "Pear", "Peach" } -SelectedIndex 0

        #Label Text for this row
        New-TextBlock -Text "Pick number" `
            -Row 1 -Column 0 @createLblStyle

        # TextBox
        New-TextBox -Name TextInputName `
          -Row 1 -Column 1 @createLblStyle 

        #Label Text for this row
        New-TextBlock -Text "Get Text Input" `
          -Row 2 -Column 0 @createLblStyle        

        #Do three radio buttons for this row.
        New-StackPanel -Row 2 -Column 1 -Orientation Horizontal {
            New-RadioButton -Content "Pick first" `
                -GroupName Results -IsChecked $True -On_Click {
                    $SelectedRadio = "First"
                }

            New-RadioButton -Content "Pick two" `
                -GroupName Results  -On_Click {
                    $SelectedRadio = "Second"
                }

            New-RadioButton -Content "Pick three" `
                -GroupName Results   -On_Click {
                    $SelectedRadio = "Third"
                }
        }


        New-Button -Content "_Call PS Script" -Row 3 -Column 0 -Margin 3 -On_Click {
          $FruitList          = $window | Get-ChildControl FruitList
          $TextInputName      = $Window | Get-ChildControl TextInputName
          $Results            = $Window | Get-ChildControl Results

          $Window.Close()
          write-host "call PS script with: "
          write-host "DropDown => " $FruitList.SelectedValue
          write-host "TextBox => " $TextInputName.Text
          write-host "Radio => " $SelectedRadio
    }

        New-Button -Content "Cancel" -Row 3 -Column 1 -Margin 3 -On_Click {
          $Window.Close()
          write-host "Cancel was pressed"
        }
      }
    }
}

3 个答案:

答案 0 :(得分:0)

据我了解,您希望在您编写的PowerShell脚本的顶部创建一个GUI。

我的意见是你有两个技术解决方案。

  1. 您在Windows窗体的顶部构建一个GUI,这是在.NET Framework中构建GUI的前一种方式
  2. 您在WPF的顶部构建GUI,这是在.NET Framework中构建GUI的新方法
  3. 在第一个解决方案中,您可以直接使用visual studio和“transform”创建表单,或使用名为“Sapien”的PrimalForms Community Edition公司工具创建表单,这是免费的适用于PowerShell用户的GUI构建器工具。您构建GUI(如.NET开发人员),该工具使用PowerShell语法生成Window Form代码。您只需在正确的位置调用脚本函数(为每个事件脚本块生成的函数)。这种解决方案适用于普通表格。

    WPF解决方案有点新近,专门针对您希望在表单中添加2D或3D图形或适应不同屏幕尺寸的情况。在此解决方案中,您必须构建表单的XAML表示(例如,使用visual studio 2010 Expess),然后将其加载到PowerShell中。此解决方案需要安装PowerShell 2.0和Framework 3.5以及特殊标志(-STA)才能启动PowerShell。对我来说,WPK模块就是这个解决方案的补充。

    它也是一种在PowerShell中创建图表的方法。

    如果您对某个或其他解决方案感兴趣,请告诉我们。

    我希望它有所帮助。

    JP

答案 1 :(得分:0)

在单选按钮的$Script:SelectedRadio脚本块中更改为On_Click

答案 2 :(得分:0)

要找出已检查三个单选按钮中的哪一个,可以使用以下表达式:

if ( ($Window | Get-ChildControl 'One' ).IsChecked ) {
   $SelectedRadioButton = '1'
} elseif ( ($Window | Get-ChildControl 'Two' ).IsChecked ) {
   $SelectedRadioButton = '2'
} elseif ( ($Window | Get-ChildControl 'Three' ).IsChecked) {
   $SelectedRadioButton = '3'
}

如果您只有一组单选按钮,则无需指定组名。也不需要On_Click事件。您可以将New-RadioButton表达式缩短为:

New-RadioButton -Name 'One'   -Content "Pick first" -IsChecked $true
New-RadioButton -Name 'Two'   -Content "Pick two"
New-RadioButton -Name 'Three' -Content "Pick three"

要查明是否有复选框:

New-CheckBox -Name 'Uno' -Content "Uno"

已经过检查,你也可以推断出它的IsChecked属性:

Write-Host "Checkbox UNo => " ($Window | Get-ChildControl UNo).IsChecked