---
title: 'Using XAML (WPF) To Build A PowerShell GUI'
url: 'https://bsb.perryconsulting.net/blog/using-xaml-wpf-to-build-a-powershell-gui'
markdown: 'https://bsb.perryconsulting.net/blog/using-xaml-wpf-to-build-a-powershell-gui.md'
date: '2019-11-02'
description: "PowerShell speaks WPF, and that means you can build a XAML-based GUI for your PowerShell script. It's easy to do - here's a small demo: POWERS"
taxonomy:
  category:
    - snippets
  tag:
    - gui
    - powershell
    - xaml
---

# Using XAML (WPF) To Build A PowerShell GUI

 02 NOV 2019  [gui](https://bsb.perryconsulting.net/blog/tag:gui) [powershell](https://bsb.perryconsulting.net/blog/tag:powershell) [xaml](https://bsb.perryconsulting.net/blog/tag:xaml)  

  PowerShell speaks WPF, and that means you can build a XAML-based GUI for your PowerShell script. It's easy to do - here's a small demo:

POWERSHELL

```
<span class="line"><span class="line-number" style="color: #88929d;-webkit-user-select: none"> 1</span><span class="token" style="color: #023b95;;--phiki-dark-color: #91cbff">Add-Type</span><span class="token"> </span><span class="token" style="color: #a0111f;;--phiki-dark-color: #ff9492">-</span><span class="token">AssemblyName PresentationFramework
</span></span><span class="line"><span class="line-number" style="color: #88929d;-webkit-user-select: none"> 2</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #88929d;-webkit-user-select: none"> 3</span><span class="token">[</span><span class="token" style="color: #a0111f;;--phiki-dark-color: #ff9492">xml</span><span class="token">]</span><span class="token" style="color: #0e1116;;--phiki-dark-color: #f0f3f6">$</span><span class="token" style="color: #0e1116;;--phiki-dark-color: #f0f3f6">XAMLForm</span><span class="token"> </span><span class="token" style="color: #a0111f;;--phiki-dark-color: #ff9492">=</span><span class="token"> </span><span class="token" style="color: #032563;;--phiki-dark-color: #addcff">@"</span><span class="token" style="color: #032563;;--phiki-dark-color: #addcff">
</span></span><span class="line"><span class="line-number" style="color: #88929d;-webkit-user-select: none"> 4</span><span class="token" style="color: #032563;;--phiki-dark-color: #addcff"><Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" Title="XAML Form" Height="150" Width="320">
</span></span><span class="line"><span class="line-number" style="color: #88929d;-webkit-user-select: none"> 5</span><span class="token" style="color: #032563;;--phiki-dark-color: #addcff">     <Canvas>
</span></span><span class="line"><span class="line-number" style="color: #88929d;-webkit-user-select: none"> 6</span><span class="token" style="color: #032563;;--phiki-dark-color: #addcff">          <Label Content="Simple XAML Form. Click button to exit." HorizontalAlignment="Left" Height="30" Margin="10,10,0,0" VerticalAlignment="Top" Width="275" FontWeight="Bold" FontSize="14"/>
</span></span><span class="line"><span class="line-number" style="color: #88929d;-webkit-user-select: none"> 7</span><span class="token" style="color: #032563;;--phiki-dark-color: #addcff">          <Button Name="btnClose" Content="Close Window" HorizontalAlignment="Center" Height="30" Margin="10,50,0,0" VerticalAlignment="Center" Width="128" ClickMode="Press"/>     
</span></span><span class="line"><span class="line-number" style="color: #88929d;-webkit-user-select: none"> 8</span><span class="token" style="color: #032563;;--phiki-dark-color: #addcff">     </Canvas>
</span></span><span class="line"><span class="line-number" style="color: #88929d;-webkit-user-select: none"> 9</span><span class="token" style="color: #032563;;--phiki-dark-color: #addcff"></Window>
</span></span><span class="line"><span class="line-number" style="color: #88929d;-webkit-user-select: none">10</span><span class="token" style="color: #032563;;--phiki-dark-color: #addcff">"@</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #88929d;-webkit-user-select: none">11</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #88929d;-webkit-user-select: none">12</span><span class="token" style="color: #0e1116;;--phiki-dark-color: #f0f3f6">$</span><span class="token" style="color: #0e1116;;--phiki-dark-color: #f0f3f6">NodeReader</span><span class="token"> </span><span class="token" style="color: #a0111f;;--phiki-dark-color: #ff9492">=</span><span class="token"> </span><span class="token">(</span><span class="token" style="color: #023b95;;--phiki-dark-color: #91cbff">New-Object</span><span class="token"> System.Xml.XmlNodeReader </span><span class="token" style="color: #0e1116;;--phiki-dark-color: #f0f3f6">$</span><span class="token" style="color: #0e1116;;--phiki-dark-color: #f0f3f6">XAMLForm</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #88929d;-webkit-user-select: none">13</span><span class="token" style="color: #0e1116;;--phiki-dark-color: #f0f3f6">$</span><span class="token" style="color: #0e1116;;--phiki-dark-color: #f0f3f6">Window</span><span class="token"> </span><span class="token" style="color: #a0111f;;--phiki-dark-color: #ff9492">=</span><span class="token"> </span><span class="token">[</span><span class="token" style="color: #a0111f;;--phiki-dark-color: #ff9492">Windows.Markup.XamlReader</span><span class="token">]</span><span class="token">::Load</span><span class="token">(</span><span class="token" style="color: #0e1116;;--phiki-dark-color: #f0f3f6">$</span><span class="token" style="color: #0e1116;;--phiki-dark-color: #f0f3f6">NodeReader</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #88929d;-webkit-user-select: none">14</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #88929d;-webkit-user-select: none">15</span><span class="token" style="color: #0e1116;;--phiki-dark-color: #f0f3f6">$</span><span class="token" style="color: #0e1116;;--phiki-dark-color: #f0f3f6">CloseButton</span><span class="token"> </span><span class="token" style="color: #a0111f;;--phiki-dark-color: #ff9492">=</span><span class="token"> </span><span class="token" style="color: #0e1116;;--phiki-dark-color: #f0f3f6">$</span><span class="token" style="color: #0e1116;;--phiki-dark-color: #f0f3f6">Window</span><span class="token" style="color: #0e1116;;--phiki-dark-color: #f0f3f6">.FindName</span><span class="token">(</span><span class="token" style="color: #032563;;--phiki-dark-color: #addcff">"</span><span class="token" style="color: #032563;;--phiki-dark-color: #addcff">btnClose</span><span class="token" style="color: #032563;;--phiki-dark-color: #addcff">"</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #88929d;-webkit-user-select: none">16</span><span class="token" style="color: #0e1116;;--phiki-dark-color: #f0f3f6">$</span><span class="token" style="color: #0e1116;;--phiki-dark-color: #f0f3f6">CloseButton</span><span class="token" style="color: #0e1116;;--phiki-dark-color: #f0f3f6">.Add_Click</span><span class="token">(</span><span class="token">{</span><span class="token" style="color: #0e1116;;--phiki-dark-color: #f0f3f6">$</span><span class="token" style="color: #0e1116;;--phiki-dark-color: #f0f3f6">Window</span><span class="token" style="color: #0e1116;;--phiki-dark-color: #f0f3f6">.Close</span><span class="token">(</span><span class="token">)</span><span class="token">}</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #88929d;-webkit-user-select: none">17</span><span class="token">
</span></span><span class="line"><span class="line-number" style="color: #88929d;-webkit-user-select: none">18</span><span class="token" style="color: #0e1116;;--phiki-dark-color: #f0f3f6">$</span><span class="token" style="color: #0e1116;;--phiki-dark-color: #f0f3f6">Window</span><span class="token" style="color: #0e1116;;--phiki-dark-color: #f0f3f6">.ShowDialog</span><span class="token">(</span><span class="token">)</span><span class="token">
</span></span>
```

Pretty straightforward. Step one is to tell PowerShell to load the PresentationFramework .NET Assembly. Step two is to build the XAML layout. Step three is to construct the XAML reader. Once you have your form built and readable by PowerShell, create variables for any XAML controls that need an event handler. Use the `$Window.FindName()` method to link to the named XAML control. Once linked, add your event handler to the variable using the block format. In this demo, that happens at `$CloseButton.Add_Click({$Window.Close()})`. All of your event handlers need to be positioned between constructing the XAML Reader and calling `ShowDialog()`.

It's also possible to use Visual Studio to design more complex XAML layouts, but there are some extra steps to clean it up enough for PowerShell to read it. It's also worth repeating, at this time PowerShell only interprets WPF, so this only works on Windows-flavored PowerShell.

---

## Navigation

- Parent: [Blog](https://bsb.perryconsulting.net/blog.md)
- Previous: [YubiKey Passthrough on VMware Workstation and VMware Fusion](https://bsb.perryconsulting.net/blog/yubikey-passthrough-on-vmware-workstation-and-vmware-fusion.md)
- Next: [Run a Powershell command based on OU Membership](https://bsb.perryconsulting.net/blog/run-a-powershell-command-based-on-ou-membership.md)
