{"id":6121,"date":"2008-05-23T04:26:00","date_gmt":"2008-05-23T04:26:00","guid":{"rendered":"https:\/\/blogs.msdn.microsoft.com\/powershell\/2008\/05\/23\/wpf-powershell-part-2-exploring-wpf-and-the-rest-of-net-with-scripts\/"},"modified":"2019-02-18T13:15:54","modified_gmt":"2019-02-18T20:15:54","slug":"wpf-powershell-part-2-exploring-wpf-and-the-rest-of-net-with-scripts","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/powershell\/wpf-powershell-part-2-exploring-wpf-and-the-rest-of-net-with-scripts\/","title":{"rendered":"WPF &#038; PowerShell &#8211; Part 2 (Exploring WPF (and the rest of .NET) with Scripts)"},"content":{"rendered":"<p class=\"MsoNormal\"><font face=\"Calibri\" size=\"3\">In my previous post, I showed you how to create \u201cHello World\u201d scripts using Windows Presentation Foundation (WPF) and Windows PowerShell.<\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Calibri\" size=\"3\">While \u201cHello World\u201d is relatively easy to write with WPF, it is only the tip of the iceberg of the types of quick user interfaces you can write.<\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Calibri\" size=\"3\">Windows Presentation Foundation provides an amazing array of controls for an incredible array of purposes.<span>&nbsp; <\/span>Out of the box, with just one control, you can:<\/font><\/p>\n<p class=\"MsoListBulletCxSpFirst\"><span><span><font size=\"3\">\u00b7<\/font><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><font face=\"Calibri\" size=\"3\">Show a listbox<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><span><span><font size=\"3\">\u00b7<\/font><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><font face=\"Calibri\" size=\"3\">Play a video or audio file<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><span><span><font size=\"3\">\u00b7<\/font><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><font face=\"Calibri\" size=\"3\">Capture user drawings<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><span><span><font size=\"3\">\u00b7<\/font><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><font face=\"Calibri\" size=\"3\">Display an image<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><span><span><font size=\"3\">\u00b7<\/font><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><font face=\"Calibri\" size=\"3\">Draw a complex polygon<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><span><span><font size=\"3\">\u00b7<\/font><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><font face=\"Calibri\" size=\"3\">Display a slider<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">&nbsp;<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">All controls can use video, images, gradients, and rich colors as their background or foreground.<span>&nbsp; <\/span>All controls can interact with Tablet PC input, Keyboard, and Mouse.<span>&nbsp; <\/span>All windows can be transparent.<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">&nbsp;<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">In the vastness of WPF, there is not a Get-Command or a Get-Help to help you discover what you can do with WPF.<span>&nbsp; <\/span>The existence of Get-Command and Get-Help is one of my favorite things about PowerShell, because it helps close what I call the Discoverability Gap.<span>&nbsp;&nbsp; <\/span>The Discoverability Gap is the difficulty in a scripter of developer determining what solutions exist for a problem.<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><span><font face=\"Calibri\" size=\"3\"><\/font><\/span>&nbsp;<\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">While PowerShell has an elegant solution to the Discoverability Gap, there have been many good attempts in the past.<span>&nbsp; <\/span>.NET\u2019s is refection.<span>&nbsp; <\/span>In this post I\u2019ll give you a couple of functions that help close the Discoverability Gap for .NET, and then show you how to find examples on MSDN.<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">&nbsp;<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">You\u2019ll need three functions for the fun.<span>&nbsp; <\/span>They\u2019re all one liners.<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">&nbsp;<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\"># Looks returns all of the .NET types currently loaded by PowerShell<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">function Get-Type() { [AppDomain]::CurrentDomain.GetAssemblies() | % { $_.GetTypes() }} <\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><span><font face=\"Calibri\" size=\"3\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/font><\/span><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\"># Opens a webpage to connect to look up information about the Type on MSDN (e.g <\/font><a href=\"http:\/\/msdn.microsoft.com\/en\/library\/System.Windows.Window.aspx\"><font face=\"Calibri\" color=\"#0000ff\" size=\"3\">http:\/\/msdn.microsoft.com\/en\/library\/System.Windows.Window.aspx<\/font><\/a><font face=\"Calibri\" size=\"3\"> ) <\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">&nbsp;<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">function Get-MSDNInfo([Type]$t) { (New-Object \u2013com Shell.Application).Open(\u201chttp:\/\/msdn.microsoft.com\/$(Get-Culture)\/library\/$($t.FullName).aspx\u201d ) }<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">&nbsp;<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\"># Create a new instance of an object and displays member info with Out-GridView, so you can search the information to find a property that might do what you want<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">function Show-ClassInfo([Type]$t) { Get-Member \u2013input (New-Object $t.FullName $args) | Out-Gridview} <\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">&nbsp;<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">With these commands, I can close a of the discoverability gap for WFP &amp; all of .NET, much more quickly.<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">&nbsp;<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">Now let&#8217;s walk through how we use these commands to find out what else is in WPF, and show some more quick WPF &amp; PowerShell samples.<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">&nbsp;<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">WPF is in the System.Windows namespace and subnamespaces, and all controls are inherited from [Windows.Controls.Control], so you can quickly find all of the loaded controls with this one liner:<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">&nbsp;<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">Get-Type | Where-Object { $_.IsSubclassOf([Windows.Controls.Control])}<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">&nbsp;<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">First, let\u2019s find a label, so we can change the font size of the Hello World.<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">&nbsp;<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">Get-Type | Where-Object { $_.IsSubclassOf([Windows.Controls.Control])} | Where-Object {$_.Name \u2013eq \u201cLabel\u201d} | Select FullName<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">&nbsp;<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font size=\"3\"><font face=\"Calibri\">FullName<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/font><\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font size=\"3\"><font face=\"Calibri\">&#8212;&#8212;&#8211;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/span><\/font><\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font size=\"3\"><font face=\"Calibri\">System.Windows.Controls.Label<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/font><\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">&nbsp;<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">Now, let\u2019s go open it in MSDN and create a gridview containing a label:<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">&nbsp;<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">Get-MSDNInfo System.Windows.Controls.Label<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">Show-ClassInfo System.Windows.Controls.Label<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">&nbsp;<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">The MSDN page gives you the details on everything that is just applicable to the label, but Get-Member gives you every property, method, and event the control has.<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">&nbsp;<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">A quick scrolling down this list will give you an idea of just how big the iceberg is. The label alone has 246 methods, properties, and events.<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">&nbsp;<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">Luckily for us, Out-Gridview has a search window.<span>&nbsp; <\/span>Let\u2019s use it to find the properties named Size.<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">&nbsp;<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">There\u2019s<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">&nbsp;<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">An Event, SizeChanged<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">A method, Measure, which takes a Size type<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">A DesiredSize Property<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">A FontSize Property<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">A RenderSize Property<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">&nbsp;<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">Obviously, FontSize is the one we want to use to make our Hello World a little larger and easier to read.<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">&nbsp;<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">Now our HelloWorld is:<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">&nbsp;<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><span>$window = New-Object Windows.Window<\/span><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><span>$window.Title = \u201cHello World\u201d<\/span><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><span>$label = New-Object Windows.Controls.Label<\/span><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><span>$label.Content, $label.FontSize = \u201cHello World\u201d, 24<\/span><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><span>$window.Content = $label<\/span><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><span>$window.SizeToContent = \u201cWidthAndHeight\u201d<\/span><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><span>$null = $window.ShowDialog()<\/span><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">&nbsp;<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">Let\u2019s take a quick tour of some of the other really simple things we can do with WPF:<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">&nbsp;<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><b><font face=\"Calibri\" size=\"3\">Create a Circle of a Random Size:<\/font><\/b><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">&nbsp;<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">$window = New-Object Windows.Window<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">$color = (\u201cRed\u201d, \u201cGreen\u201d,\u201dBlue\u201d,\u201dYellow\u201d | Get-Random)<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">$window.Title = \u201cSee The Big $color Ball\u201d<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">$circle = New-Object Windows.Shapes.Ellipse<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $circle.Width = $circle.Height = Get-Random \u2013min 200 \u2013max 450<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $circle.Fill = $color<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $window.Content = $circle<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $window.SizeToContent = \u201cWidthAndHeight\u201d<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $null = $window.ShowDialog()<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">&nbsp;<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><b><font size=\"3\"><font face=\"Calibri\">Create an Ink Canvas the user can scribble on with the mouse or stylus<\/font><\/font><\/b><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><b><font face=\"Calibri\" size=\"3\">&nbsp;<\/font><\/b><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">&nbsp;&nbsp;&nbsp;&nbsp; $window = New-Object Windows.Window<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">&nbsp;&nbsp;&nbsp;&nbsp; $window.Title = \u201cScribble on Me\u201d<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">&nbsp;&nbsp;&nbsp;&nbsp; $inkCanvas = New-Object Windows.Controls.InkCanvas<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">&nbsp;&nbsp;&nbsp;&nbsp; $inkCanvas.MinWidth = $inkCanvas.MinHeight = 100<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">&nbsp;&nbsp;&nbsp;&nbsp; $window.Content = $inkCanvas<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">&nbsp;&nbsp;&nbsp;&nbsp; $window.SizeToContent = \u201cWidthAndHeight\u201d<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">&nbsp;&nbsp;&nbsp;&nbsp; $null = $window.ShowDialog()<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">&nbsp;<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><b><font size=\"3\"><font face=\"Calibri\">Show a slider, and get the value the slider was at after running:<\/font><\/font><\/b><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><b><font face=\"Calibri\" size=\"3\">&nbsp;<\/font><\/b><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">$window = new-object Windows.Window<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">$slider = New-Object Windows.Controls.Slider<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">$slider.Maximum = 10<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">$slider.Minimum = 0<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">$window.Content = $slider<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">$window.SizeToContent = &#8220;WidthAndHeight&#8221;<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">$null = $window.ShowDialog()<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $slider.Value<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">&nbsp;<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><b><font size=\"3\"><font face=\"Calibri\">Show a label and textbox, and emit the value the textbox contained:<\/font><\/font><\/b><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><b><font face=\"Calibri\" size=\"3\">&nbsp;<\/font><\/b><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">$window = new-object Windows.Window<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">$stackPanel = new-object Windows.Controls.StackPanel<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">$text = New-Object Windows.Controls.TextBox<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">$label = New-Object Windows.Controls.Label<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">$label.Content = &#8220;Type Something&#8221;<\/font><\/p>\n<p><font face=\"Calibri\" size=\"3\"><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">$stackPanel.Children.Add($label)<\/font>&nbsp;<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">$stackPanel.Children.Add($text)<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $window.Content = $stackPanel<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">$window.SizeToContent = &#8220;WidthAndHeight&#8221;<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">$null = $window.ShowDialog()<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $text.Text<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">&nbsp;<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">This post should give you a better sample of what WPF Contains, and how to close the Discoverability Gap and learn how to script more.<span>&nbsp; <\/span>Stay tuned to see more interactive WPF.<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">&nbsp;<\/font><\/p>\n<p class=\"MsoListBulletCxSpMiddle\"><font face=\"Calibri\" size=\"3\">Hope this Helps,<\/font><\/p>\n<p class=\"MsoListBulletCxSpLast\"><font face=\"Calibri\" size=\"3\">James Brundage [MSFT]<\/font><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In my previous post, I showed you how to create \u201cHello World\u201d scripts using Windows Presentation Foundation (WPF) and Windows PowerShell. While \u201cHello World\u201d is relatively easy to write with WPF, it is only the tip of the iceberg of the types of quick user interfaces you can write. Windows Presentation Foundation provides an amazing [&hellip;]<\/p>\n","protected":false},"author":600,"featured_media":13641,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[144,234,248,360],"class_list":["post-6121","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-powershell","tag-discoverability-gap","tag-out-gridview","tag-powershell","tag-wpf"],"acf":[],"blog_post_summary":"<p>In my previous post, I showed you how to create \u201cHello World\u201d scripts using Windows Presentation Foundation (WPF) and Windows PowerShell. While \u201cHello World\u201d is relatively easy to write with WPF, it is only the tip of the iceberg of the types of quick user interfaces you can write. Windows Presentation Foundation provides an amazing [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/powershell\/wp-json\/wp\/v2\/posts\/6121","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/powershell\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/powershell\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/powershell\/wp-json\/wp\/v2\/users\/600"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/powershell\/wp-json\/wp\/v2\/comments?post=6121"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/powershell\/wp-json\/wp\/v2\/posts\/6121\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/powershell\/wp-json\/wp\/v2\/media\/13641"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/powershell\/wp-json\/wp\/v2\/media?parent=6121"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/powershell\/wp-json\/wp\/v2\/categories?post=6121"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/powershell\/wp-json\/wp\/v2\/tags?post=6121"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}