Hooooly jebus chwist! This took a LONG time for me to get my head around and an even longer time to implement and get working (still breaking it every minute!). I used this website and this website to help me learn the basics.
Today, I’m going to show you how to create a responsive WPF from using PowerShell. This utilises runspaces and a synchronised hashta… never mind the technical stuff!
This is the code that I used:
#CREATE HASHTABLE AND RUNSPACE FOR GUI $syncHash = [hashtable]::Synchronized(@{}) $newRunspace =[runspacefactory]::CreateRunspace() $newRunspace.ApartmentState = "STA" $newRunspace.ThreadOptions = "ReuseThread" $newRunspace.Open() $newRunspace.SessionStateProxy.SetVariable("syncHash",$syncHash) #BUILD GUI AND ADD TO RUNSPACE CODE $psCmd = [PowerShell]::Create().AddScript({ $xaml = @" <Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" Name="Window" Height="400" Width="600"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto" /> </Grid.ColumnDefinitions> <Button Name="Button" Content="Press" Height="200" Width="580" Grid.Row="0" Grid.Column="0" /> <TextBox Name="Textbox" Height="200" Width="580" Grid.Row="1" Grid.Column="0" /> </Grid> </Window> "@ #INTERPRET AND LOAD THE GUI $reader=(New-Object System.Xml.XmlNodeReader $xaml) $syncHash.Window=[Windows.Markup.XamlReader]::Load( $reader ) #EXTRACT THE CONTROLS FROM THE GUI $syncHash.TextBox = $syncHash.window.FindName("Textbox") $syncHash.Button = $syncHash.Window.FindName("Button") #FINALISE AND CLOSE GUI RUNSPACE UPON EXITING $syncHash.Window.ShowDialog() | Out-Null $syncHash.Error = $Error $Runspace.Close() $Runspace.Dispose() }) #LOAD RUNSPACE WITH GUI IN $psCmd.Runspace = $newRunspace $data = $psCmd.BeginInvoke()
Using this, you can then use the same command prompt used to launch the script to change the form. E.g. to change the text in the textbox we would use:
$syncHash.Window.Dispatcher.Invoke( [action]{$syncHash.TextBox.Text = "Updated text here"} )
In another post, I’ll show you how to update the textbox using a button on the same form. Exciting stuff, right?
Leave a comment if you have any questions or issues. Enjoy!