Использование WPK для PowerShell GUI - PullRequest
6 голосов
/ 10 марта 2011

Мы создали несколько великолепных скриптов PowerShell. Но со временем мы передали сценарии не программистам. Поэтому мы решили, что пришло время для простого и понятного графического интерфейса для PowerShell.

Я смотрел видео 9-го канала Джеймса Брундейджа. Его видео отлично справляются с объяснениями Window, Stack-Panel, Doc-Panel, Grid, Labels и Textboxes. Однако всего имеется более 60 элементов управления. Незнание WPF не помогает.

Я бы хотел сделать следующее:

Ввод текста
Раскрывающийся список
RadioButton Group
Флажок Группа

Я придумал пример, который делает первые три, но с ошибками.
Радиоуправление визуально показывает первую выбранную кнопку, но когда я выбираю значение для группы, это не правильно.

Я не могу найти пример для флажка.

Любые советы будут оценены.

Вот мой тест WPK в PowerShell:

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 голосов
/ 05 сентября 2013

Изменить на $Script:SelectedRadio в On_Click скриптовых блоках радиокнопок.

0 голосов
/ 23 декабря 2013

Чтобы узнать, какая из ваших трех радиокнопок была проверена, вы можете использовать следующее выражение:

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
0 голосов
/ 18 марта 2011

Насколько я понимаю, вы хотите создать графический интерфейс поверх написанного вами сценария PowerShell.

Мое мнение, что у вас есть два технических решения.

  1. Вы строите графический интерфейс в верхней части формы Windows, которая является первым способом создания графического интерфейса в .NET Framework
  2. Вы строите графический интерфейс поверх WPF, который является новым способом создания графического интерфейса в de .NET Framework

В первом решении вы можете напрямую создать свою форму с помощью Visual Studio и " преобразовать " или создать ее с помощью Sapien фирменного инструмента под названием " PrimalForms Community Edition."- бесплатный инструмент для создания графического интерфейса для пользователей PowerShell. Вы создаете свой графический интерфейс (например, разработчик .NET), а инструмент генерирует код оконной формы в синтаксисе PowerShell. Вам просто нужно вызвать вашу функцию сценария в нужном месте (которое генерируется для каждого блока сценария события). Это решение подходит для нормальных форм.

Решение WPF немного новее и специально предназначено для случая, когда вы хотите добавить двухмерный или трехмерный график в свои формы или адаптировать его к экрану другого размера. В этом решении вы должны создать XAML-представление вашей формы (например, в Visual Studio 2010 Expess) и затем загрузить его в PowerShell. Для этого решения требуются PowerShell 2.0 и Framework 3.5, а также специальные флаги (-STA) для запуска PowerShell. Для меня модуль WPK построен на этом решении.

Существует также способ создания диаграмм в PowerShell.

Если вы заинтересованы в том или ином решении, пожалуйста, дайте мне знать.

Надеюсь, это поможет.

JP * +1027 *

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