| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- # 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
- }
- }
- }
|