6 Stimmen

Verwendung von WPK für PowerShell GUI

Wir haben einige großartige PowerShell-Skripte erstellt. Aber im Laufe der Zeit haben wir die Skripte an Nicht-Programmierer weitergegeben. Also haben wir beschlossen, dass es Zeit für eine einfache, leicht verständliche GUI für die PowerShell war.

Ich habe mir die Channel 9-Videos von James Brundage angesehen. In seinen Videos werden Window, Stack-Panel, Doc-Panel, Grid, Labels und Textboxen sehr gut erklärt. Insgesamt gibt es jedoch über 60 Steuerelemente. Wenn man WPF nicht kennt, ist das nicht hilfreich.

Ich würde gerne Folgendes tun können:

Texteingabe
Auswahlliste
RadioButton-Gruppe
Checkbox-Gruppe

Ich habe mir ein Beispiel ausgedacht, das die ersten drei Punkte erfüllt, allerdings mit Fehlern.
Das Optionsfeld zeigt visuell die erste ausgewählte Schaltfläche an, aber wenn ich den Wert für die Gruppe ziehe, ist er nicht korrekt.

Ich kann kein Beispiel für das Kontrollkästchen finden.

Für jeden Tipp wären wir dankbar.

Hier ist mein Test von WPK in 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"
        }
      }
    }
}

0 Stimmen

Was ist das Problem mit der Optionsschaltfläche? Ich kann keine sehen.

0 Stimmen

Bernd, wenn ich versuche, die ausgewählte Schaltfläche zurückzubekommen, gibt sie mir nicht diejenige, die ich ausgewählt habe.

0 Stimmen

Ich habe alle Fälle getestet: Ausgangszustand, mittlere, rechte, linke Optionsschaltfläche und "Call PS Script": Radio => Erste, Radio => Erste, Radio => Dritte, Radio => Erste. Haben Sie immer den gleichen Wert erhalten oder haben Sie verschiedene, aber falsche Werte erhalten?

0voto

JPBlanc Punkte 66875

Soweit ich verstanden habe, möchten Sie eine grafische Benutzeroberfläche auf der Grundlage eines von Ihnen geschriebenen PowerShell-Skripts erstellen.

Meiner Meinung nach gibt es zwei technische Lösungen.

  1. Sie bauen eine grafische Benutzeroberfläche auf dem Windows-Formular auf, was die frühere Methode zur Erstellung von grafischen Benutzeroberflächen im .NET Framework ist.
  2. Sie erstellen eine GUI auf der Grundlage von WPF, einer neuen Art der GUI-Erstellung in de .NET Framework

Bei der ersten Lösung können Sie Ihr Formular direkt mit Visual Studio erstellen und " umwandeln " oder erstellen Sie es mit einer Sapien Unternehmens-Tool namens " PrimalForms Gemeinschaftsausgabe " ist ein kostenloses GUI-Builder-Tool für PowerShell-Benutzer. Sie erstellen Ihre GUI (wie ein .NET-Entwickler) und das Tool generiert den Window Form-Code in PowerShell-Syntax. Sie müssen nur Ihre Skriptfunktion an der richtigen Stelle aufrufen (die Funktion, die für jeden Ereignisskriptblock generiert wird). Diese Lösung ist für normale Formulare in Ordnung.

Die WPF-Lösung ist etwas aktueller und speziell für den Fall gedacht, dass Sie 2D- oder 3D-Grafiken in Ihre Formulare einfügen oder an verschiedene Bildschirmgrößen anpassen möchten. Bei dieser Lösung müssen Sie eine XAML-Darstellung Ihres Formulars erstellen (z. B. mit Visual Studio 2010 Expess) und diese dann in PowerShell laden. Für diese Lösung muss PowerShell 2.0 und Framework 3.5 installiert sein, sowie spezielle Flags (-STA), um PowerShell zu starten. Für mich ist das WPK Modul auf diese Lösung aufgebaut.

Es gibt auch eine Möglichkeit, Diagramme in PowerShell zu erstellen.

Wenn Sie an der einen oder anderen Lösung interessiert sind, lassen Sie es mich bitte wissen.

Ich hoffe, es hilft.

JP

0voto

Sigitas Punkte 89

Wechseln zu $Script:SelectedRadio in On_Click Skriptblöcke von Radiobuttons.

0voto

wfr Punkte 125

Um herauszufinden, welche der drei Optionsschaltflächen aktiviert wurde, können Sie den folgenden Ausdruck verwenden:

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

Wenn Sie nur eine Gruppe von Optionsfeldern haben, müssen Sie keinen Gruppennamen vergeben. Auch ein On_Click-Ereignis ist nicht erforderlich. Sie könnten Ihre New-RadioButton-Ausdrücke verkürzen auf:

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

Um herauszufinden, ob ein Kontrollkästchen:

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

geprüft wurde, würden Sie auch die Eigenschaft IsChecked ableiten:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X