WPF Form aus Visual Studio als Formular mit der PowerShell nutzen

Hallo Community,

die Verwendung von Formularen als kleine Eingabemasken ist auch in Zeiten der PowerShell immer wieder ein Thema.
Heute möchte ich euch eine Methode beschreiben, mit der ihr eure Formulare in Visual Studio (http://msdn.microsoft.com/de-de/vstudio/) erstellt und mit eurem Skript ansprecht. Zuerst müsst ihr in Visual Studio ein neues Projekt vom Typ Windows / WPF Applikation erstellen. Dabei ist es unerheblich ob dies mit C# oder Visual Basic erstellt wird. Als nächstes entwerft ihr das Formular wie ihr es benötigt. Also Buttons, Label, Listen hinzufügen und, das ist ganz wichtig, jedem der Controls einen Namen geben. Speichert das Projekt ab und merkt euch den Pfad in dem die XAML Datei abgelegt wird.

Aber jetzt genug mit den Vorbereitungen und los geht es mit dem Skripten in der PowerShell. In dem Skript sind zuerst die Assemblies für das Presentation Framework und System als Typ hinzuzufügen. Dies geschieht mit den folgenden Zeilen:
Add-Type -AssemblyName PresentationFramework
Add-Type -AssemblyName
System

Danach wird der Inhalt er XAML Datei mittels Get-Content in eine [XML] typisierte Variable eingelesen.
[XML]$XAML = Get-Content D:\ps\WPF\PS_WPF_Sample.xaml

Der nächste Schritt ist ein kleiner Kunstgriff um das native Visual Studio Format in der PowerShell einbinden zu können. Es geht darum das Attribut x:class zu entfernen. Visual Studio benötigt diese Klasse aber die PowerShell kann auch wunderbar ohne dieses Attribut auskommen. Also weg damit…
$XAML.Window.RemoveAttribute(“x:Class”)

 Jetzt kann es mit nativer PowerShell und XML weiter gehen. Das Formular wird als Reader eingelesen und danach geladen.
$Reader = New-Object System.Xml.XmlNodeReader $XAML
$Form = [Windows.Markup.XamlReader]::Load($Reader)

Über die Variable $Form habt ihr jetzt den vollen Zugriff auf das WPF Formular. Jetzt gilt es die einzelnen Controls direkt ansprechen zu können.
Da die einzelnen Controls innerhalb von Visual Studio mit Namen versehen wurden können wir jetzt mit der PowerShell danach suchen und das Ergebnis in eine Variable pro Control packen.
$PSBtnOK = $Form.FindName(‘PSBtnOK’)

Jetzt gilt es den gefundenen Controls bzw. ihren Variablen die gleichen Tricks beizubringen wie Ihren Verwandten in Visual Studio d.h. es müssen Events zu den jeweiligen Variablen hinzugefügt werden. Welche dies sind hängt natürlich von dem jeweiligen Control ab und bei einem Button ist das natürlich der Click Event. Und so wird er in der PowerShell hinzugefügt:
$PSBtnOK.Add_Click($btnOKClick)

Als vorletzter Schritt muss der hinterlegte Skript-Block noch mit Leben gefüllt werden.  Das kann z.B. so aussehen:
$btnOKClick = {$PSLabel.Content = $PSText.Text}

Zu guter Letzt ist das Ganze noch in eine Funktion zu packen und diese muss als letztes aufgerufen werden. Die eigentliche Anzeige des Formulars erfolgt mit der Methode
$Form.ShowDialog() | Out-Null

Für den Aufruf kann entweder die ISE oder die PowerShell.exe mit dem Schalter -STA verwendet werden da WPF diese Option benötigt.

Anbei findet ihr in dem Artikel auch das beschriebe Skript sowie die XAML Datei. Die Pfade müsst ihr natürlich auf eure Gegebenheiten anpassen.

Viel Spaß mit dieser Art Formulare bereit zu stellen.
C:\PS> Get-Help -Name Rolf

WPF Sample 001

PS_WPF_Sample.ps1

PS_WPF_Sample.xaml

Comments are currently closed.