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!