2011-03-09 28 views
6

Abbiamo creato alcuni script di PowerShell di grandi dimensioni. Ma col passare del tempo abbiamo dato le sceneggiature ai non programmatori. Quindi abbiamo deciso che era giunto il momento di una GUI semplice e intuitiva per PowerShell.Utilizzo di WPK per la GUI PowerShell

Ho visto i video del canale 9 di James Brundage. I suoi video fanno un ottimo lavoro di spiegazione di Window, Stack-Panel, Doc-Panel, Grid, Labels e Textboxes. Tuttavia ci sono oltre 60 controlli in totale. Non sapendo che WPF non aiuta.

Quello che vorrei fare è essere in grado di effettuare le seguenti operazioni:

Text Input
elenco a discesa
RadioButton Group
Casella

mi si avvicinò con un esempio che fa la primi tre ma con bug.
Il controllo radio mostra visivamente il primo pulsante selezionato, ma quando tiro il valore per il gruppo non è corretto.

Non riesco a trovare un esempio per la casella di controllo.

Qualsiasi consiglio sarebbe apprezzato.

Ecco la mia prova di PLC 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

Qual è il problema con il pulsante di scelta? Non riesco a vederne. –

+0

bernd, è quando tento di riavere il pulsante selezionato, non mi dà quello che ho selezionato. – Razcer

+0

Ho provato tutti i casi di e, stato iniziale, tasto centrale, destro, sinistro e "Chiama PS Script": Radio => Primo, Radio => Primo, Radio => Terzo, Radio => Primo. Hai sempre avuto lo stesso valore o sei diventato diverso, ma valori sbagliati? –

risposta

0

Per quanto ho capito, si vuole creare una GUI sulla parte superiore di uno script PowerShell che hai scritto.

La mia opinione è che tu abbia due soluzioni tecniche.

  1. a costruire una GUI sulla parte superiore del Windows Form, che è l'ex modo per costruire GUI in de .NET Framework
  2. Si crea un interfaccia grafica sulla parte superiore del WPF, wich è un nuovo modo di costruire GUI in de .NET Framework

nella prima soluzione è possibile creare direttamente il modulo con visual Studio e "transform", o creare con uno strumento Sapien società denominata "PrimalForms Community Edition" che è una GUI builder gratuito strumento per utenti PowerShell. Costruisci la tua GUI (come un sviluppatore .NET) e lo strumento genera il codice Window Form nella sintassi di PowerShell. Devi solo chiamare la funzione di script nel posto giusto (quello generato per ogni blocco di script di evento). Questa soluzione è ok per le forme normali.

La soluzione WPF è un po 'più recente e specificatamente dedicata al caso in cui si desidera aggiungere un grafico 2D o 3D nelle proprie forme o l'adattamento a diverse dimensioni dello schermo. In questa soluzione devi costruire una rappresentazione XAML del tuo modulo (con Visual Studio 2010 Expess per esempio) e quindi caricarlo in PowerShell. Questa soluzione richiede PowerShell 2.0 e Framework 3.5 installati oltre a flag speciali (-STA) per avviare PowerShell. Per me il modulo WPK è costruito su questa soluzione.

Esiste anche un modo per creare grafici in PowerShell.

Se siete interessati all'una o all'altra soluzione, fatemelo sapere.

Spero sia d'aiuto.

JP

+0

JP, Sto provando specificamente a farlo usando PowerShellPack (WPK) e non creando un modulo di Windows. Es: Esegui uno script che apre una piccola finestra per alcuni semplici input. Con un pulsante che chiama più script per utilizzare l'input fornito. Posso farlo funzionare con New-TextBox/New-ComboBox (aggiungendo manualmente gli oggetti) ma sto ancora cercando di trovare esempi di sintassi per New-RadioButton (List)/New-CheckBox (List) e possibilmente un ListBox invece di ComboBox. – Razcer

0

Scelgo $Script:SelectedRadio in On_Click scriptblocks di radiobutton.

0

per scoprire quale dei tre pulsanti di opzione è stato controllato, è possibile utilizzare la seguente espressione:

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

Se si dispone di un solo gruppo di pulsanti di opzione, non v'è alcuna necessità di assegnare un nome di gruppo . Non è inoltre necessario un evento On_Click. Si potrebbe accorciare le vostre espressioni New-RadioButton a:

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

Per scoprirlo, se una casella di controllo:

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

è stato controllato, si potrebbe anche dedurre la sua proprietà IsChecked:

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