Form
Form
Ein Form ist das Fenster einer Windows-Forms-Anwendung. Es dient als oberster Container für Controls wie Panel, Button, Label, TextBox, TabControl oder TableLayoutPanel.
Ein Form kann sowohl als Hauptfenster einer Anwendung als auch als Dialogfenster verwendet werden.
Grundlagen
Ein Form stellt die sichtbare Oberfläche einer Windows-Forms-Anwendung dar.
Typischer Aufbau:
Form
├── Panel
│ ├── Label
│ └── Button
├── TabControl
│ ├── TabPage
│ └── TabPage
└── TableLayoutPanel
Controls werden über die Controls-Collection des Formulars hinzugefügt:
$form.Controls.Add($button)
Das entspricht dem grundlegenden Aufbau der anderen Windows-Forms-Controls, die ebenfalls über eine Controls-Collection miteinander verschachtelt werden.
Form erstellen
Klassisch
$form = New-Object System.Windows.Forms.Form
.NET-Style
$form = [System.Windows.Forms.Form]::new()
Anschließend können Eigenschaften gesetzt und Controls hinzugefügt werden:
$form = [System.Windows.Forms.Form]::new()
$form.Text = "Meine Anwendung"
$form.Size = "800, 600"
$button = [System.Windows.Forms.Button]::new()
$button.Text = "OK"
$form.Controls.Add($button)
Formular anzeigen
Nicht modal
Mit Show() wird das Formular angezeigt, ohne den aufrufenden Code zu blockieren.
$form.Show()
Das Formular bleibt geöffnet, während das PowerShell-Skript weiter ausgeführt wird.
Modal
Mit ShowDialog() wird das Formular als modales Fenster geöffnet.
$result = $form.ShowDialog()
Der aufrufende Code wartet, bis das Formular geschlossen wird.
Besonders bei Dialogfenstern ist ShowDialog() interessant, da über DialogResult ein Ergebnis zurückgegeben werden kann. Dieses Prinzip wird beispielsweise auch bei Buttons verwendet.
Eigenschaften
| Eigenschaft | Standardwert | Beschreibung |
|---|---|---|
AcceptButton |
$null |
Legt den Button fest, der bei Betätigung der Enter-Taste ausgelöst wird. |
AutoScaleMode |
Font |
Bestimmt, anhand welcher Grundlage das Formular automatisch skaliert wird. |
AutoScroll |
False |
Aktiviert automatische Scrollleisten für übergroße Inhalte. |
BackColor |
Control |
Legt die Hintergrundfarbe des Formulars fest. |
BackgroundImage |
$null |
Legt ein Hintergrundbild fest. |
CancelButton |
$null |
Legt den Button fest, der bei Betätigung der Escape-Taste ausgelöst wird. |
ClientSize |
abhängig vom Standard-Layout | Legt die Größe des nutzbaren Inhaltsbereichs fest. |
ControlBox |
True |
Bestimmt, ob die Schaltflächen der Titelleiste angezeigt werden. |
Cursor |
Default |
Legt den Mauszeiger innerhalb des Formulars fest. |
FormBorderStyle |
Sizable |
Bestimmt die Art des Fensterrahmens. |
Icon |
Standardicon | Legt das Symbol des Fensters fest. |
KeyPreview |
False |
Bestimmt, ob das Formular Tastatureingaben vor seinen Controls erhält. |
Location |
abhängig vom System | Bestimmt die Position des Fensters auf dem Bildschirm. |
MaximizeBox |
True |
Legt fest, ob das Fenster maximiert werden kann. |
MaximumSize |
(0,0) |
Definiert die maximal zulässige Fenstergröße. |
MinimizeBox |
True |
Legt fest, ob das Fenster minimiert werden kann. |
MinimumSize |
(0,0) |
Definiert die minimal zulässige Fenstergröße. |
Name |
"" |
Legt den internen Namen des Formulars fest. |
Opacity |
1.0 |
Bestimmt die Transparenz des Fensters. |
Padding |
0,0,0,0 |
Legt den Innenabstand zwischen Fensterrahmen und Inhalt fest. |
ShowIcon |
True |
Bestimmt, ob das Fenstersymbol angezeigt wird. |
ShowInTaskbar |
True |
Bestimmt, ob das Fenster in der Taskleiste erscheint. |
Size |
abhängig vom System | Bestimmt Breite und Höhe des Fensters. |
StartPosition |
WindowsDefaultLocation |
Bestimmt die Position beim ersten Anzeigen des Fensters. |
Text |
"" |
Legt den Text in der Titelleiste fest. |
TopMost |
False |
Legt fest, ob das Fenster immer über anderen Fenstern bleibt. |
WindowState |
Normal |
Bestimmt den aktuellen Zustand des Fensters. |
AutoScaleMode
AutoScaleMode
Typ = [System.Windows.Forms.AutoScaleMode]
AutoScaleMode bestimmt, anhand welcher Grundlage das Formular und seine Controls automatisch skaliert werden.
Typische Werte sind:
None→ keine automatische SkalierungFont→ Skalierung anhand der SchriftgrößeDpi→ Skalierung anhand der DPI-EinstellungInherit→ übernimmt die Einstellung des übergeordneten Controls
$form.AutoScaleMode = "Font"
Gerade bei unterschiedlichen Windows-Skalierungseinstellungen kann diese Eigenschaft wichtig sein, damit die Oberfläche nicht plötzlich aussieht, als hätte Windows sie durch einen Briefkastenschlitz geschoben.
AutoScroll
AutoScroll
Typ = [System.Boolean]
AutoScroll aktiviert automatische Scrollleisten, wenn der Inhalt des Formulars größer als dessen sichtbarer Bereich ist.
Standardwert = False
$form.AutoScroll = $true
Die Eigenschaft ist besonders bei Formularen mit dynamisch erzeugten oder umfangreichen Controls hilfreich.
BackColor
BackColor
Typ = [System.Drawing.Color]
BackColor legt die Hintergrundfarbe des Formulars fest.
$form.BackColor = "White"
BackgroundImage
BackgroundImage
Typ = [System.Drawing.Image]
BackgroundImage legt ein Bild fest, das als Hintergrund des Formulars dargestellt wird.
$form.BackgroundImage = [System.Drawing.Image]::FromFile(
"C:\Images\background.png"
)
Die Darstellung des Bildes kann zusätzlich über BackgroundImageLayout beeinflusst werden.
ClientSize
ClientSize
Typ = [System.Drawing.Size]
ClientSize bestimmt die Größe des nutzbaren Inhaltsbereichs des Formulars.
Im Gegensatz zu Size berücksichtigt ClientSize nicht den Fensterrahmen und die Titelleiste.
$form.ClientSize = "800, 500"
Das ist insbesondere bei Layoutberechnungen interessant, wenn die Größe des eigentlichen Inhaltsbereichs relevant ist.
In deinem Windows-Setup-Helper verwendest du beispielsweise ClientSize, um die Formulargröße abhängig von der ausgewählten TabPage anzupassen.
ControlBox
ControlBox
Typ = [System.Boolean]
ControlBox bestimmt, ob die Steuerelemente der Titelleiste angezeigt werden.
Standardwert = True
$form.ControlBox = $false
Bei deaktivierter ControlBox werden die entsprechenden Fenster-Schaltflächen wie Schließen, Minimieren und Maximieren nicht mehr auf normale Weise dargestellt.
FormBorderStyle
FormBorderStyle
Typ = [System.Windows.Forms.FormBorderStyle]
FormBorderStyle bestimmt die Art des Fensterrahmens und damit unter anderem, ob der Benutzer die Größe des Fensters verändern kann.
Typische Werte:
| Wert | Beschreibung |
|---|---|
None |
Kein Fensterrahmen |
FixedSingle |
Fester einfacher Rahmen |
Fixed3D |
Fester 3D-Rahmen |
FixedDialog |
Fester Dialograhmen |
Sizable |
Fenstergröße kann verändert werden |
FixedToolWindow |
Festes Werkzeugfenster |
SizableToolWindow |
Veränderbares Werkzeugfenster |
$form.FormBorderStyle = "FixedDialog"
Für normale Hauptfenster ist Sizable üblich.
Icon
Icon
Typ = [System.Drawing.Icon]
Icon legt das Symbol des Formulars fest.
$form.Icon = [System.Drawing.Icon]::ExtractAssociatedIcon(
"C:\Program Files\App\App.exe"
)
Das Icon kann unter anderem in der Titelleiste und Taskleiste angezeigt werden.
KeyPreview
KeyPreview
Typ = [System.Boolean]
KeyPreview bestimmt, ob das Formular Tastatureingaben vor den enthaltenen Controls erhält.
Standardwert = False
$form.KeyPreview = $true
Dadurch können beispielsweise globale Tastenkombinationen auf Formularebene behandelt werden.
$form.Add_KeyDown({
param($sender, $e)
if ($e.KeyCode -eq "F5") {
Write-Host "F5 gedrückt"
}
})
Ohne KeyPreview kann ein fokussiertes Control die Tastatureingabe zuerst verarbeiten.
Location
Location
Typ = [System.Drawing.Point]
Location legt die Position des Formulars auf dem Bildschirm fest.
$form.Location = "100, 100"
Die beiden Werte entsprechen:
X = 100
Y = 100
Die Startposition kann alternativ über StartPosition automatisch bestimmt werden.
MaximizeBox
MaximizeBox
Typ = [System.Boolean]
MaximizeBox bestimmt, ob das Fenster über die Titelleiste maximiert werden kann.
Standardwert = True
$form.MaximizeBox = $false
Bei Dialogfenstern wird die Maximierung häufig deaktiviert.
MaximumSize
MaximumSize
Typ = [System.Drawing.Size]
MaximumSize legt die maximal zulässige Größe des Formulars fest.
Standardwert = (0,0)
Der Wert (0,0) bedeutet, dass keine maximale Größe festgelegt wurde.
$form.MaximumSize = "1200, 800"
MinimizeBox
MinimizeBox
Typ = [System.Boolean]
MinimizeBox bestimmt, ob das Fenster über die Titelleiste minimiert werden kann.
Standardwert = True
$form.MinimizeBox = $false
MinimumSize
MinimumSize
Typ = [System.Drawing.Size]
MinimumSize legt die minimal zulässige Größe des Formulars fest.
Standardwert = (0,0)
$form.MinimumSize = "600, 400"
Damit kann verhindert werden, dass der Benutzer das Fenster so weit verkleinert, dass Controls nicht mehr sinnvoll dargestellt werden.
Name
Name
Typ = [System.String]
Name legt den internen Namen des Formulars fest.
$form.Name = "MainForm"
Der Name dient der Identifikation innerhalb des Programms und wird dem Benutzer nicht angezeigt.
Opacity
Opacity
Typ = [System.Double]
Opacity bestimmt die Deckkraft des Fensters.
Der Wertebereich liegt zwischen 0 und 1.
| Wert | Darstellung |
|---|---|
0 |
vollständig transparent |
0.5 |
50 % Deckkraft |
1 |
vollständig sichtbar |
$form.Opacity = 0.8
Standardwert = 1
Padding
Padding
Typ = [System.Windows.Forms.Padding]
Padding legt den Innenabstand zwischen dem Rand des Formulars und dessen Inhalt fest.
$form.Padding = [System.Windows.Forms.Padding]::new(10)
Der Wert wird insbesondere beim Layout der enthaltenen Controls berücksichtigt.
ShowIcon
ShowIcon
Typ = [System.Boolean]
ShowIcon bestimmt, ob das Icon des Formulars in der Titelleiste angezeigt wird.
Standardwert = True
$form.ShowIcon = $false
ShowInTaskbar
ShowInTaskbar
Typ = [System.Boolean]
ShowInTaskbar bestimmt, ob das Formular als eigenes Fenster in der Windows-Taskleiste erscheint.
Standardwert = True
$form.ShowInTaskbar = $false
Dies kann beispielsweise bei Hilfs- oder Dialogfenstern sinnvoll sein.
Size
Size
Typ = [System.Drawing.Size]
Size bestimmt die gesamte Größe des Formulars einschließlich Fensterrahmen und Titelleiste.
$form.Size = "800, 600"
Für die Größe des reinen Inhaltsbereichs sollte stattdessen ClientSize verwendet werden.
StartPosition
StartPosition
Typ = [System.Windows.Forms.FormStartPosition]
StartPosition bestimmt, wo das Formular beim ersten Anzeigen positioniert wird.
Typische Werte:
| Wert | Beschreibung |
|---|---|
Manual |
Position wird über Location bestimmt |
CenterScreen |
Zentriert auf dem Bildschirm |
WindowsDefaultLocation |
Windows bestimmt die Position |
WindowsDefaultBounds |
Windows bestimmt Position und Größe |
CenterParent |
Zentriert relativ zum übergeordneten Fenster |
Beispiel:
$form.StartPosition = "CenterScreen"
Für Dialogfenster ist häufig CenterParent sinnvoll.
Text
Text
Typ = [System.String]
Text bestimmt den Text in der Titelleiste des Formulars.
Standardwert = ""
$form.Text = "Meine Anwendung"
In deinem Windows-Setup-Helper wird der Titel beispielsweise beim Load-Event dynamisch erweitert.
TopMost
TopMost
Typ = [System.Boolean]
TopMost bestimmt, ob das Formular dauerhaft über anderen normalen Fenstern angezeigt wird.
Standardwert = False
$form.TopMost = $true
Ein TopMost-Fenster bleibt über normalen Fenstern, auch wenn diese den Fokus erhalten.
WindowState
WindowState
Typ = [System.Windows.Forms.FormWindowState]
WindowState bestimmt den aktuellen Zustand des Formulars.
Mögliche Werte:
| Wert | Beschreibung |
|---|---|
Normal |
Normale Fensterdarstellung |
Minimized |
Minimiert |
Maximized |
Maximiert |
$form.WindowState = "Maximized"
Der Standardwert ist:
Normal
Methoden
| Methode | Beschreibung |
|---|---|
Show() |
Zeigt das Formular nicht modal an. |
ShowDialog() |
Zeigt das Formular modal an und wartet auf dessen Schließen. |
Close() |
Schließt das Formular. |
Hide() |
Versteckt das Formular, ohne es zu schließen. |
Activate() |
Aktiviert das Formular und bringt es in den Vordergrund. |
CenterToScreen() |
Zentriert das Formular auf dem Bildschirm. |
CenterToParent() |
Zentriert das Formular relativ zum Parent-Fenster. |
Refresh() |
Erzwingt eine Aktualisierung der Darstellung. |
Focus() |
Versucht, den Tastaturfokus auf das Formular zu setzen. |
Dispose() |
Gibt die vom Formular verwendeten Ressourcen frei. |
Show()
Show()
$form.Show()
Zeigt das Formular an, ohne den aufrufenden Code zu blockieren.
Das Skript kann nach dem Aufruf weiterarbeiten.
ShowDialog()
ShowDialog()
$result = $form.ShowDialog()
Zeigt das Formular als modales Fenster an.
Der aufrufende Code wird angehalten, bis das Formular geschlossen wird.
Der Rückgabewert ist ein [System.Windows.Forms.DialogResult].
$result = $form.ShowDialog()
if ($result -eq "OK") {
Write-Host "Bestätigt"
}
Zusammen mit AcceptButton, CancelButton und DialogResult lassen sich damit klassische Dialogfenster aufbauen.
Close()
Close()
$form.Close()
Schließt das Formular.
Bei einem Hauptformular kann das Schließen außerdem dazu führen, dass die Anwendung beendet wird, abhängig davon, wie die Windows-Forms-Anwendung gestartet wurde.
Hide()
Hide()
$form.Hide()
Versteckt das Formular, ohne es zu zerstören.
Das Formular kann anschließend erneut mit Show() angezeigt werden.
$form.Hide()
# später
$form.Show()
Im Gegensatz zu Close() bleibt das Formular dabei bestehen.
Activate()
Activate()
$form.Activate()
Aktiviert das Formular und versucht, es in den Vordergrund zu bringen.
Dies kann beispielsweise verwendet werden, wenn ein bereits geöffnetes Fenster erneut angezeigt werden soll.
CenterToScreen()
CenterToScreen()
$form.CenterToScreen()
Positioniert das Formular in der Mitte des Bildschirms.
Alternativ kann bereits beim Start festgelegt werden:
$form.StartPosition = "CenterScreen"
CenterToParent()
CenterToParent()
$form.CenterToParent()
Zentriert das Formular relativ zu seinem übergeordneten Fenster.
Dies ist insbesondere für Dialogfenster sinnvoll.
Dispose()
Dispose()
$form.Dispose()
Gibt die vom Formular verwendeten Ressourcen frei.
Nach Dispose() sollte das Formular nicht weiterverwendet werden.
In deinem Setup-Helper wird beispielsweise das aktuelle Formular über Dispose() geschlossen und freigegeben, bevor der Prozess anschließend neu gestartet wird.
Events
Ein Form besitzt eine große Anzahl an Events. Besonders häufig werden folgende verwendet:
| Event | Beschreibung |
|---|---|
Load |
Wird ausgelöst, wenn das Formular geladen wird. |
Shown |
Wird ausgelöst, nachdem das Formular erstmals angezeigt wurde. |
FormClosing |
Wird unmittelbar vor dem Schließen ausgelöst. |
FormClosed |
Wird nach dem Schließen ausgelöst. |
Resize |
Wird bei einer Größenänderung ausgelöst. |
SizeChanged |
Wird ausgelöst, wenn sich Size ändert. |
KeyDown |
Wird beim Drücken einer Taste ausgelöst. |
KeyUp |
Wird beim Loslassen einer Taste ausgelöst. |
KeyPress |
Wird bei einer Zeichen-Tastatureingabe ausgelöst. |
Activated |
Wird ausgelöst, wenn das Formular aktiviert wird. |
Deactivate |
Wird ausgelöst, wenn das Formular den Fokus verliert. |
Move |
Wird beim Verschieben des Formulars ausgelöst. |
Beispiel:
$form.Add_Load({
Write-Host "Formular geladen"
})
$form.Add_Shown({
Write-Host "Formular angezeigt"
})
$form.Add_FormClosed({
Write-Host "Formular geschlossen"
})
In deinem eigenen Code verwendest du beispielsweise FormClosed, Load, Resize und Shown für unterschiedliche Initialisierungs- und Lebenszyklusaufgaben.
Typischer Aufbau
Ein einfaches Formular mit Button kann beispielsweise so aussehen:
Add-Type -AssemblyName System.Windows.Forms
$form = [System.Windows.Forms.Form]::new()
$form.Text = "Meine Anwendung"
$form.ClientSize = "500, 300"
$form.StartPosition = "CenterScreen"
$button = [System.Windows.Forms.Button]::new()
$button.Text = "Schließen"
$button.Size = "120, 35"
$button.Location = "190, 130"
$button.Add_Click({
$form.Close()
})
$form.Controls.Add($button)
$form.ShowDialog()
Damit entsteht bereits eine vollständige kleine Windows-Forms-Anwendung:
┌─────────────────────────────────────┐
│ Meine Anwendung □ × │
├─────────────────────────────────────┤
│ │
│ ┌──────────┐ │
│ │ Schließen│ │
│ └──────────┘ │
│ │
└─────────────────────────────────────┘
Size vs. ClientSize
Bei Form ist die Unterscheidung besonders wichtig:
$form.Size = "800, 600"
bestimmt die gesamte Fenstergröße.
$form.ClientSize = "800, 600"
bestimmt dagegen die Größe des nutzbaren Bereichs innerhalb des Fensterrahmens.
Das ist einer dieser kleinen .NET-Unterschiede, die zunächst völlig harmlos aussehen und später dafür sorgen, dass ein Layout um exakt die Höhe der Titelleiste danebenliegt.
Show() vs. ShowDialog()
| Methode | Modal | Blockiert Code | Rückgabewert |
|---|---|---|---|
Show() |
❌ | ❌ | keiner |
ShowDialog() |
✅ | ✅ | DialogResult |
Für ein normales Hauptfenster:
$form.Show()
Für einen Dialog:
$result = $form.ShowDialog()
Hinweise
Formist selbst einControlund kann deshalb viele Eigenschaften und Events der Basisklasse verwenden.- Ein Formular besitzt eine
Controls-Collection und kann damit als Container für andere Controls dienen. Show()eignet sich für nicht-modale Fenster.ShowDialog()eignet sich für modale Dialogfenster.Close()schließt das Formular, währendHide()es lediglich unsichtbar macht.Dispose()gibt die verwendeten Ressourcen frei.ClientSizebeschreibt den nutzbaren Inhaltsbereich,Sizedagegen die gesamte Fenstergröße.StartPositionist für die Positionierung beim ersten Anzeigen zuständig.KeyPreviewist nützlich, wenn das Formular Tastatureingaben unabhängig vom fokussierten Control verarbeiten soll.AcceptButtonundCancelButtonerleichtern die Umsetzung klassischer Dialogfenster.
Damit ist Form im Grunde die oberste Ebene deiner gesamten WinForms-Struktur. Panel, TableLayoutPanel, TabControl und Co. organisieren den Inhalt darin, während Form das eigentliche Fenster und dessen Lebenszyklus verwaltet. Das passt auch ziemlich genau zu dem Aufbau, den du in deinen eigenen PowerShell-UI-Strukturen bereits verwendest.