Creare una Windows Form in PowerShell
In PowerShell è possibile creare delle Windows Form in modo da poter arricchire l'interfaccia utente.La form e i controlli necessari vanno dichiarati via codice e posizionati sempre via codice, senza il supporto di un designer grafico.
Per questo motivo non è conveniente realizzare form complessi, ma può essere efficace per semplici form.
Si parte creando la Windows Form con la classe Windows.Forms.Form.
Successivamente si creano gli altri controlli come button (System.Windows.Forms.Button), label (System.Windows.Forms.Label), ecc...
Da tener presente che tutti i controlli devono essere aggiunti alla collection Controls della form tramite il metodo Add ($form.Controls.Add(...)).
Quando la Windows Form è pronta la posso visualizzare tramite il metodo ShowDialog ($form.ShowDialog()).
L'esempio seguente visualizza la form dell'immagine precedente:
Il bottone btn1 gestisce anche l'evento click, aggiunto tramite il metodo Add_Click ($btn1.Add_Click($HandleClick)).
L'evento è definito all'inizio del codice e salvato in una variabile ($HandleClick).
Per questo motivo non è conveniente realizzare form complessi, ma può essere efficace per semplici form.
Si parte creando la Windows Form con la classe Windows.Forms.Form.
Successivamente si creano gli altri controlli come button (System.Windows.Forms.Button), label (System.Windows.Forms.Label), ecc...
Da tener presente che tutti i controlli devono essere aggiunti alla collection Controls della form tramite il metodo Add ($form.Controls.Add(...)).
Quando la Windows Form è pronta la posso visualizzare tramite il metodo ShowDialog ($form.ShowDialog()).
L'esempio seguente visualizza la form dell'immagine precedente:
PowerShell: sgart-test-win-form.ps1
# https://www.sgart.it
# sgart-test-win-form.ps1: esempio di form windows
#--------------------------------------------------------------------------
# aggiungo le reference necessarie per il Windows Form
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
# gestisco l'evento click e lo assegno a una "variabile"
$HandleClick = {
param($obj)
$now = Get-Date
Write-Host "Evento: $($obj) - $now"
# aggiorno il testo della label con l'ora corrente
$lbl1.Text = "Ora: $now"
}
# creo la Windows Form
$width = 300
$height = 200
$form = New-Object Windows.Forms.Form -Property @{
StartPosition = [Windows.Forms.FormStartPosition]::CenterScreen # imposto la posizione iniziale del form
Size = New-Object Drawing.Size $width, $height # imposto le dimensioni del form
Text = "Test windows Form - Sgart.it" # imposto il titolo della finesta
Topmost = $true # sempre in primo piano
#MaximizeBox = $false
#FormBorderStyle = [Windows.Forms.FormBorderStyle]::FixedSingle
}
# creo un bottone con evento
$btn1 = New-Object System.Windows.Forms.Button -Property @{
Location = New-Object System.Drawing.Point 20, 20 # definisco la posizione nel form
Size = New-Object System.Drawing.Size 150, 30 # definisco le dimensioni del pulsante
Text = "Cliccami" # definisco il testo del pulsante
}
$btn1.Add_Click($HandleClick) # aggiungo l'evento sul click
$form.Controls.Add($btn1) # importante: aggiungo il bottone alla form
#creo una label
$lbl1 = New-Object System.Windows.Forms.Label -Property @{
Location = New-Object System.Drawing.Point 20, 70
Size = New-Object System.Drawing.Size 250, 30
Text = "-" # testo della label
#ForeColor = "#ff0000"
#BackColor = "#eeee00"
#TextAlign = [System.Drawing.ContentAlignment]::MiddleCenter
#Font = [System.Drawing.Font]::new("Microsoft Sans Serif", 16.0, [System.Drawing.FontStyle]::Bold)
}
$form.Controls.Add($lbl1) # aggiungo la label alla form
# bottone di chiusura form
$btn2 = New-Object System.Windows.Forms.Button -Property @{
Location = New-Object System.Drawing.Point 20, 120
Size = New-Object System.Drawing.Size 150, 30
Text = "Chiudi"
# lo imposto in modo che chiuda la finestra di dialogo
DialogResult = [System.Windows.Forms.DialogResult]::Cancel
}
$form.Controls.Add($btn2) # aggiungo il bottone alla form
# visualizzo la form
$form.ShowDialog()
L'evento è definito all'inizio del codice e salvato in una variabile ($HandleClick).