# Displays one or more controls. Controls are piped to Show-Control function Show-Control { cmdlet ` -DefaultParameterSet VisualElement param( [Parameter(Mandatory=$true, ParameterSetName="VisualElement", ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true)] [Windows.Media.Visual] $control, [Parameter(Mandatory=$true, ParameterSetName="Xaml", ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true)] [string] $xaml, [Parameter(ValueFromPipelineByPropertyName=$true,Position=0)] [Hashtable] $event, [Hashtable] $windowProperties, # If this switch is set, outputs a psuedoobject of the control and events [switch] $outputControl ) Begin { $window = New-Object Windows.Window $window.SizeToContent = "WidthAndHeight" if ($windowProperties) { foreach ($kv in $windowProperties.GetEnumerator()) { $window."$($kv.Key)" = $kv.Value } } $visibleElements = @() $windowEvents = @() } Process { Write-Verbose "Xaml: $xaml" Write-Verbose "Events: $($event | Out-String)" switch ($psCmdlet.ParameterSetName) { "Xaml" { $f = [System.xml.xmlreader]::Create([System.IO.StringReader] $xaml) $visibleElements+=([system.windows.markup.xamlreader]::load($f)) } "VisualElement" { $visibleElements+=$control } } if ($event) { $element = $visibleElements[-1] foreach ($evt in $event.GetEnumerator()) { # If the event name is like *.*, it is an event on a named target, otherwise, it's on any of the events on the top level object if ($evt.Key.Contains(".")) { $targetName = $evt.Key.Split(".")[1].Trim() if ($evt.Key -like "Window.*") { $target = $window } else { $target = ($visibleElements[-1]).FindName(($evt.Key.Split(".")[0])) } } else { $target = $visibleElements[-1] $targetName = $evt.Key } $target | Get-Member -type Event | ? { $_.Name -eq $targetName } | % { $eventMethod = $target."add_$targetName" $eventMethod.Invoke($evt.Value) } } } } End { if ($visibleElements.Count -gt 1) { $wrapPanel = New-Object Windows.Controls.WrapPanel $visibleElements | % { $null = $wrapPanel.Children.Add($_) } $window.Content = $wrapPanel } else { if ($visibleElements) { $window.Content = $visibleElements[0] } } if ($outputControl) { $true | Select-Object @{Name='Control';Expression={$visibleElements}}, @{Name='Event';Expression={$event}} } else { $null = $window.ShowDialog() $window.Tag } } }