While doing a PowerShell GUI project for a one of my client, they wanted to use one of the WPF control – GridSplitter, in such a way that it will switch or show different images while sliding GridSplitter. This cool effect can be easily achieved by using WPF bindings. I am using horizontal grid splitter and two images. Below is the main source code in the grid for splitter.
<Grid Margin="10,70,209,57">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Image x:Name="After" HorizontalAlignment="Left"
Grid.ColumnSpan="3" />
<Image x:Name="Before" HorizontalAlignment="Left"
Width="{Binding ActualWidth, ElementName=After}"
Height="{Binding ActualHeight, ElementName=After}" />
<GridSplitter Grid.Column="1" Width="5" HorizontalAlignment="Center"/>
</Grid>
This beautiful splitter Effect, you can see in the below video. You can download the code here or it is also available on github.com.
<#
.NOTES
===========================================================================
Created on: 2019/06/21
Created by: Kunal udapi
GitHub link: kunaludapi
Twitter: @kunaludapi
Url1: https://thecloudcurry.com
Url2: http://vcloud-lab.com
===========================================================================
#>
#Load required libraries
Add-Type -AssemblyName PresentationFramework, PresentationCore, WindowsBase, System.Windows.Forms, System.Drawing
$xaml = @"
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApp7"
Title="Image Splitter Demo - Climate Change" Height="470" Width="800" Icon="$PSScriptRoot\Images\Icon.ico" >
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="$PSScriptRoot\themes\Metro.MSControls.Core.Implicit.xaml"/>
<ResourceDictionary Source="$PSScriptRoot\themes\Styles.WPF.xaml"/>
<ResourceDictionary Source="$PSScriptRoot\themes\Theme.Colors.xaml"/>
<ResourceDictionary Source="$PSScriptRoot\themes\Styles.Shared.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resources>
<Grid>
<Grid Margin="10,70,209,57">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Image x:Name="After" HorizontalAlignment="Left"
Grid.ColumnSpan="3" />
<Image x:Name="Before" HorizontalAlignment="Left"
Width="{Binding ActualWidth, ElementName=After}"
Height="{Binding ActualHeight, ElementName=After}" />
<GridSplitter Grid.Column="1" Width="5" HorizontalAlignment="Center"/>
</Grid>
<TextBox x:Name="textBoxBefore" HorizontalAlignment="Left" Height="23" Margin="10,10,0,0" TextWrapping="Wrap" Text="Image1" VerticalAlignment="Top" Width="271"/>
<TextBox x:Name="textBoxAfter" Height="23" Margin="286,10,223,0" TextWrapping="Wrap" Text="Image2" VerticalAlignment="Top"/>
<Image x:Name="imageLegands" Height="43" Margin="25,46,252,0" VerticalAlignment="Top" Source="$PSScriptRoot\Images\Legands.png"/>
<StatusBar Name="statusBar1" Height="30" HorizontalAlignment="Stretch" VerticalAlignment="Bottom" Background="SkyBlue">
<StatusBarItem Content="http://vcloud-lab.com" Width="150"/>
<StatusBarItem Content="https://thecloudcurry.com" Width="150" />
<StatusBarItem HorizontalAlignment="Right">
</StatusBarItem>
</StatusBar>
<Button x:Name="buttonBrowse1" HorizontalAlignment="Left" Margin="241,10,0,0" VerticalAlignment="Top" Width="40" Height="23">
<Image HorizontalAlignment="Left" VerticalAlignment="Top" Source="$PSScriptRoot\Images\Browse.png" Height="23" Width="23" Cursor="Hand"/>
</Button>
<Button x:Name="buttonBrowse2" Margin="0,10,224,0" VerticalAlignment="Top" HorizontalAlignment="Right" Width="40" Height="23">
<Image HorizontalAlignment="Left" VerticalAlignment="Top" Source="$PSScriptRoot\Images\Browse.png" Width="23" Height="23" Cursor="Hand" />
</Button>
<TextBlock x:Name="textBlock" Margin="10,0,209,35" TextWrapping="Wrap" Text="Rapid Emissions Reductions (RCP 2.6) Continued Emissions Reductions (RCP 8.5)" VerticalAlignment="Bottom" Height="22"/>
<TextBlock HorizontalAlignment="Right" Margin="0,46,10,57" TextWrapping="Wrap" Text="Greenhouse gas concentrations in the atmosphere will continue to increase unless the billions of tons of our annual emissions decrease substantially. Increased concentrations are expected to:
* Increase Earth's average temperature
* Influence the patterns and amounts of precipitation
* Reduce ice and snow cover, as well as permafrost
* Raise sea level
* Increase the acidity of the oceans
* Increase the frequency, intensity, and/or duration of extreme events
* Shift ecosystem characteristics
* Increase threats to human health" Width="193"/>
</Grid>
</Window>
"@
#Read the form
$Reader = (New-Object System.Xml.XmlNodeReader $xaml)
$Form = [Windows.Markup.XamlReader]::Load($reader)
#AutoFind all controls
$xaml.SelectNodes("//*[@*[contains(translate(name(.),'n','N'),'Name')]]") | ForEach-Object {
New-Variable -Name $_.Name -Value $Form.FindName($_.Name) -Force
}
function Get-PictureFile([string] $InitialDirectory )
{
[System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") | Out-Null
$openFileDialog = New-Object System.Windows.Forms.OpenFileDialog
$openFileDialog.initialDirectory = $initialDirectory
$openFileDialog.filter = "All files (*.png, *.jpg)| *.png; *.jpg"
$openFileDialog.ShowDialog() | Out-Null
$openFileDialog.filename
}
$buttonBrowse1.Add_Click({
$image1File = Get-PictureFile -InitialDirectory [Environment]::GetFolderPath('MyPicture')
$textBoxBefore.Text = $image1File
$Before.Source = $image1File
})
$buttonBrowse2.Add_Click({
$image2File = Get-PictureFile -InitialDirectory [Environment]::GetFolderPath('MyPicture')
$textBoxAfter.Text = $image2File
$After.Source = $image2File
})
#Mandetory last line of every script to load form
$Form.ShowDialog() | Out-Null
Useful Blogs
COOL POWERSHELL FREE ONLINE GUI GENERATOR TOOL, POSHGUI
Powershell Azure Inventory GUI Utility
Powershell WPF custom Image based ProgressBar
Powershell WPF Themes guide step by step
