Ok, this weather widget created by Joel “Jaykul” Bennett (Blog | Twitter) is just amazingly cool. This widget auto-updates the temperature and even updates the picture to reflect the current conditions outside. The requirement to run this is by having the Show-UI module downloaded on your computer. If you like to build UI’s or are curious about what it takes to build one, I would highly recommend you download this and give it a run.
Now while I have Show-UI available at home and have put a couple small UIs together for my own learning, having it at work is another story all together. The change management process is pretty brutal and I am not all that confident that it will get approval (long story and not one that I will go into here). So, being that I wanted this widget at work, I went on the task of creating a widget just like the one that was created with Show-UI so I can use it at work. While working on this, I found that the amount of code required to make this happen was almost 3 1/2 times the code required in Show-UI (110 vs. 31). That and just the look of the code to me on the Show-UI just seems more organized and easier to work with (once I got past the initial learning curve and started writing some small UI’s to get a feel for it).
This difference in the amount of code is, to me, more than enough reason to build UI’s using Show-UI. While there is a requirement for downloading and running the module in order to take advantage of this, if you have the option of doing so, then I would recommend it! I am currently in the process of taking my existing UI’s and making them using Show-UI (it is taking a little while as I am working on other projects as well both work and personal).
Some great sites showing various examples of using Show-UI
http://www.dougfinke.com/blog/index.php/category/showui/
http://blog.startautomating.com/ShowUI.posts.html
http://www.ravichaganti.com/blog/?cat=279
So what are you waiting for? Download Show-UI and put together some cool UIs to show off!
So if you’re in the same boat as me at your workplace where you waiting to get Show-UI approved for work, you can use the code below to have your own weather widget. But I would recommend you use Joel’s code if you do have Show-UI available at your office.
Non Show-UI Weather Widget download
Remove .doc extension to view code in notepad. Change extension to .ps1 to run with PowerShell.
Weather Widget Code (Non Show-UI)
Param ($ZipCode = 68123)
$Global:rs = [RunspaceFactory]::CreateRunspace()
$rs.ApartmentState = “STA”
$rs.ThreadOptions = “ReuseThread”
$rs.Open()
$psCmd = {Add-Type -AssemblyName PresentationCore,PresentationFramework,WindowsBase}.GetPowerShell()
$rs.SessionStateProxy.SetVariable('ZipCode',$ZipCode)
$psCmd.Runspace = $rs
$psCmd.Invoke()
$psCmd.Commands.Clear()
$psCmd.AddScript({
#Load Required Assemblies
Add-Type –assemblyName PresentationFramework
Add-Type –assemblyName PresentationCore
Add-Type –assemblyName WindowsBase
$update = {
$h = (Get-Date).Hour
$channel = ([xml](New-Object Net.WebClient).DownloadString("http://weather.yahooapis.com/forecastrss?p=$ZipCode")).rss.channel
$temp.text = $channel.item.condition.temp + [char]176
$HiLow.text = "Hi: {0}`tLow: {1}" -f $channel.item.forecast[0].High,$channel.item.forecast[0].low
if($h -gt ([DateTime]$channel.astronomy.sunrise).Hour -and $h -lt ([DateTime]$channel.astronomy.sunset).Hour) {
$dayOrNight = 'd'
} else {
$dayOrNight = 'n'
}
$Image.source = "http`://l.yimg.com/a/i/us/nws/weather/gr/{0}{1}.png" -f $channel.item.condition.code, $dayOrNight
}
[xml]$xaml = @"
<Window
xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'
xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'
x:Name='Window' WindowStyle = 'None' WindowStartupLocation = 'CenterScreen' SizeToContent = "WidthAndHeight" ShowInTaskbar = 'True'
ResizeMode = 'NoResize' Title = 'Weather' AllowsTransparency = 'True' Background = 'Transparent' Opacity = '1' Topmost = 'True'>
<Grid x:Name = 'Grid' Background = 'Transparent'>
<Rectangle RadiusX = '10' RadiusY = '10' StrokeThickness = '0' Width = '170' Height = '80'
HorizontalAlignment = 'Left' VerticalAlignment = 'Top' Margin = '60,40,0,0'>
<Rectangle.Fill>
<LinearGradientBrush StartPoint = '0.5,0' EndPoint = '0.5,1'>
<LinearGradientBrush.GradientStops>
<GradientStop Color='#FF007bff' Offset='0' />
<GradientStop Color='#FF40d6ff' Offset='1' />
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</Rectangle.Fill>
</Rectangle>
<TextBlock x:Name = 'temp' FontSize= '80' Foreground = 'White' Margin = '130,0,0,0'>
<TextBlock.Effect>
<DropShadowEffect Color = 'Black' ShadowDepth = '0' BlurRadius = '8' />
</TextBlock.Effect>
</TextBlock>
<TextBlock x:Name = 'HiLow' FontSize= '13' Foreground = 'White' Margin = '90,95,0,0'>
<TextBlock.Effect>
<DropShadowEffect Color = 'Black' ShadowDepth = '0' BlurRadius = '8' />
</TextBlock.Effect>
</TextBlock>
<Image x:Name = 'Image' Stretch = 'Uniform' Width = '250.0' Height = '180.0' />
</Grid>
</Window>
"@
$reader=(New-Object System.Xml.XmlNodeReader $xaml)
$Global:Window=[Windows.Markup.XamlReader]::Load( $reader )
$Image = $Window.Content.Children | Where {$_.Name -eq 'Image'}
$temp = $Window.FindName("temp")
$location = $Window.FindName("location")
$HiLow = $Window.FindName("HiLow")
$Window.Add_MouseLeftButtonDown({
$This.DragMove()
})
#Timer Event
$Window.Add_SourceInitialized({
#Create Timer object
Write-Verbose "Creating timer object"
$Global:timer = new-object System.Windows.Threading.DispatcherTimer
#Fire off every 1 minutes
Write-Verbose "Adding 1 minute interval to timer object"
$timer.Interval = [TimeSpan]"0:1:0.00"
#Add event per tick
Write-Verbose "Adding Tick Event to timer object"
$timer.Add_Tick({
Try {
&$Update
}
Catch {
$temp.text = 'N/A'
}
[Windows.Input.InputEventHandler]{ $Global:Window.UpdateLayout() }
Write-Verbose "Updating Window"
})
#Start timer
Write-Verbose "Starting Timer"
$timer.Start()
If (-NOT $timer.IsEnabled) {
$Window.Close()
}
})
$Window.Add_Loaded({
Try {
&$Update
}
Catch {
$temp.text = 'N/A'
}
})
$Window.ShowDialog() | Out-Null
}).BeginInvoke() | out-null

I suggest adding a download link for your code sample as an ASCII text file so readers don’t have to rely on trying to copy and paste.
That is a great idea. I will look into getting that done this week.
Thanks, Jeff!