Continuing on with my series on PowerShell and WPF, I am going to talk about using checkboxes in a form.
Checkboxes are a great way to allow a user to select a specific item or items prior to moving on with an action.
An example of this is below:
#Build the GUI [xml]$xaml = @" <Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Name="Window" Title="Initial Window" WindowStartupLocation = "CenterScreen" SizeToContent = "WidthAndHeight" ShowInTaskbar = "True" Background = "lightgray"> <StackPanel > <CheckBox x:Name="Item1" Content = 'Item1'/> <CheckBox x:Name="Item2" Content = 'Item2'/> <CheckBox x:Name="Item3" Content = 'Item3'/> <TextBox /> </StackPanel> </Window> "@ $reader=(New-Object System.Xml.XmlNodeReader $xaml) $Window=[Windows.Markup.XamlReader]::Load( $reader ) $Item1 = $Window.FindName('Item1') $Item2 = $Window.FindName('Item2') $Item3 = $Window.FindName('Item3') $Window.Showdialog() | Out-Null
With this approach, we can check 1 or more of these checkboxes.
With these items checked, we can check the IsChecked property for each checkbox to see that they have been checked which is great when using a comparison operator such as –eq or –ne.
So far, we have seen how there are two states: checked and unchecked. But there is also another state that you can use which requires you to set the property IsThreeState = ‘True’ on the checkbox control. By doing so, you now get something like this:
What do you think will happen when we look at the IsChecked properties of each checkbox, especially $Item2.
In this case, the checkbox with the alternate checkbox doesn’t have a True or False property, it is simply Null. Something to keep in mind when working with the IsThreeState property.
I have covered a couple of the more useful properties, now it is time to look at a few events that relate to each of the types of checkbox IsChecked properties.
Using the Checked event, whenever the checkbox is set to the IsChecked=$True property, an event can kick off. Same goes for the Unchecked event with IsProperty=$False. Indeterminate event only works when the checkbox is not a checkbox and not unchecked.
I’ve added a couple more textboxes to handle each checkbox.
#Build the GUI [xml]$xaml = @" <Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Name="Window" Title="Initial Window" WindowStartupLocation = "CenterScreen" SizeToContent = "WidthAndHeight" ShowInTaskbar = "True" Background = "lightgray"> <StackPanel > <CheckBox x:Name="Item1" Content = 'Item1' IsThreeState = 'True' /> <CheckBox x:Name="Item2" Content = 'Item2' IsThreeState = 'True' /> <CheckBox x:Name="Item3" Content = 'Item3' IsThreeState = 'True' /> <TextBox x:Name='Item1_txt' /> <TextBox x:Name='Item2_txt' /> <TextBox x:Name='Item3_txt' /> </StackPanel> </Window> "@ $reader=(New-Object System.Xml.XmlNodeReader $xaml) #Connect to Controls $Window=[Windows.Markup.XamlReader]::Load( $reader ) $Item1 = $Window.FindName('Item1') $Item2 = $Window.FindName('Item2') $Item3 = $Window.FindName('Item3') $Item1_txt = $Window.FindName('Item1_txt') $Item2_txt = $Window.FindName('Item2_txt') $Item3_txt = $Window.FindName('Item3_txt') #Events ## Item1 $Item1.Add_Checked({ $Item1_txt.Text = "$($This.name) State: Checked" }) $Item1.Add_UnChecked({ $Item1_txt.Text = "$($This.name) State: Unchecked" }) $Item1.Add_Indeterminate({ $Item1_txt.Text = "$($This.name) State: Indeterminate" }) ## Item2 $Item2.Add_Checked({ $Item2_txt.Text = "$($This.name) State: Checked" }) $Item2.Add_UnChecked({ $Item2_txt.Text = "$($This.name) State: Unchecked" }) $Item2.Add_Indeterminate({ $Item2_txt.Text = "$($This.name) State: Indeterminate" }) ## Item3 $Item3.Add_Checked({ $Item3_txt.Text = "$($This.name) State: Checked" }) $Item3.Add_UnChecked({ $Item3_txt.Text = "$($This.name) State: Unchecked" }) $Item3.Add_Indeterminate({ $Item3_txt.Text = "$($This.name) State: Indeterminate" }) $Window.Showdialog() | Out-Null
If you are looking to have a group of checkboxes in which only one can be selected in the group, then you have 2 options:
- Create an event handler to manually uncheck the other checkboxes when a checkbox is checked
- Use the RadioButton control instead in which this is the controls purpose.
I won’t cover the RadioButton here, but will show a quick example of using a event to to uncheck other checkboxes when one has been checked.
I removed the IsThreeState property from this round and will only focus on the two possible options. Rather than make an event for each checkbox, I am going to make a single event scriptblock and apply it to each control.
#Events ## Checked Events [System.Windows.RoutedEventHandler]$Script:CheckBoxChecked = { $Window.Content.Children | Where { $_ -is [System.Windows.Controls.CheckBox] -AND $This.Name -ne $_.Name } | ForEach { $_.IsChecked = $False } } $Window.Content.Children | Where { $_ -is [System.Windows.Controls.CheckBox] } | ForEach { $_.AddHandler([System.Windows.Controls.CheckBox]::CheckedEvent, $CheckBoxChecked) }
Here I define the scriptblock to look for all checkboxes which do not match the name of the checkbox that had been clicked to show a checkbox. From there, I go through each checkbox and set the IsChecked property to $False. After applying each of these event scriptblocks to all of my Checkbox controls, we are set to try and click each checkbox to see if I can have more than one at a time.
That is all to working with the Checkbox control using PowerShell and WPF!
sorry i reply to my comment …
$Font = New-Object System.Drawing.Font(“Times New Roman”,18,[System.Drawing.FontStyle]::Italic)
$CheckBox.Font = $Font
Regards
Hi,
It’s possible to change font size of checkbox ?
Regards
Pingback: Trying to find documentation for using GUI elements in Powershell - How to Code .NET
I want to make a clear button which will uncheck all the checkboxes and radio buttons in my powershell ui
Hi I’m new with Powershell,
Today I create a form with Visual Studio, with different textboxes, and combobox.
This works fine.
But there’s on checkbox in this form.
And I like it, when this one is checked, It create an new variable, which one I later need in my code for example:
$WPFchBox.IsChecked if( { $NewVariable = “yes”})
Can one of you drive in the right direction?
Hi Bill,
Try this: If ($WPFchBox.IsChecked) { $NewVariable = “Yes” }
Pingback: PowerShell and WPF: Radio Button | Learn Powershell | Achieve More