Podder Skinning Competition Hall of Fame

August 12, 2008

There were five contestants in the Podder Skinning Competition.  Each of them submitted something very cool and interesting, but the three judges had to pick one winner out of them.  After much deliberation and conversation, we decided that the winning skin is BOConnor by Brendan O’Connor.  Congratulations, Brendan!



Here is a brief bio about Brendan:

Brendan is 25 years old and currently the lead software developer for a Healthcare company in Ireland called Technical Ideas.  He studied Computing and Software development at college for 4 years and has been with the company since it began in 2004.  The main product they develop is called Socrates. It is a software product used by GP’s, Nurses and many other Healthcare professionals which manages an Electronic Health Record for patients within their practice and also the day to day running of the practice.  Currently they develop in C# .NET WinForms with SQL Server 2005.  Brendan had never used WPF until he decided to enter the Podder Skinning competition.  He has been following it for many months, briefly reading articles from the WPF posse posted at CodeProject.  He also had some books on WPF lying around for some months untouched and once the competition was extended, saying he would enter just to give him an excuse to try out WPF and see what it was like.

The competition had three judges, including myself.  The other two were Marlon Grech and Jeremiah Morrill.  I appreciate their help and thoughtful feedback.

Here are all of the contestants and links to their submitted Podder skins:

Gary Winter : http://gwinter8217.googlepages.com/home

Rudi Grobler : http://dotnet.org.za/rudi/archive/2008/07/31/my-podder-skins.aspx

Jobi : http://jobijoy.blogspot.com/2008/08/podder-skinning-another-wpf-contest.html

Brendan : http://www.bstash.com/Podder/Podder.zip

Boris : http://cid-f2590eadde4ae4bc.skydrive.live.com/browse.aspx/Public

I’d like to thank everyone who took the time to submit a skin, and those who helped judge the skins!


The Podder Skinning Competition is a success!

August 4, 2008

It seems that extending the Podder Skinning Competition deadline by a month worked out well.  Today was the deadline, and there are five contestants!  Technically one of them was a few hours past the deadline, but I can tell he really put his all into this, so I’m going to let it slide.  😉

Now the judges will decide which of the contestants is the winner.  Since there were five entries, there will be only one winner, according to the rules laid out in the competition’s write-up.  I hope to have the final decision made within a few days or a week.  Stay tuned to see who won…

All of the submissions can be found in the comments of this post:


The Podder Skinning Competition Deadline has been extended

July 1, 2008

The Podder Skinning Competition deadline has been extended to 00:00 (i.e. 12:00 AM) GMT on Monday, August 4, 2008. Only one person submitted an entry by the initial deadline (several others were submitted several hours too late). Most of the contestants said they just need more time to work on their skins. Since the whole purpose of this contest is to have fun and be creative, I see no reason why we shouldn’t have an extra month to work out the details!

Thanks to Rudi Grobler, the guy who actually submitted a skin on time, for graciously suggesting that the deadline be extended. That was very cool of you, Rudi! 8)

Anyone who has already submitted a skin, don’t worry. I deleted your submission comments so that people can’t steal your awesome ideas! Feel free to keep working on your skin and submit it again when you’re ready.

Let’s have some fun! I can’t wait to see what you come up with…

The race is on!

June 30, 2008

The Podder Skinning Competition deadline is quickly drawing near.  As of 12:00 AM GMT on Tuesday, July 1, 2008 your opportunity to submit a Podder skin will be over.  The first submission has already be made, by Rudi Grobler (based on the work of Jose Fajardo).  I am very excited to see what else is submitted.  Stay tuned…

Brennon Williams Sweetens the Pot

May 21, 2008

The Podder Skinning Competition is at full speed now! The first place winner now stands to also win a copy of the new book Microsoft Expression Blend Unleashed, courtesy of Brennon Williams. Brennon is the author of that book, and also the newest WPF Disciple. Thanks a lot, Brennon!

IdentityMine Sweetens the Pot

May 7, 2008

The Podder Skinning Competition is really starting to heat up now!  IdentityMine is now giving away their awesome blendables product as a prize to the winners.  The list of prizes has grown quite a bit since the competition first began, and this latest addition definitely cranks it up a notch.  Thanks a lot, IdentityMine! 8)

I have already received a few e-mails and comments from people who are creating a Podder skin for the competition.  I can’t wait to see what they come up with.  Also, Karl told me that he is locked onto winning the steak dinner at Smith & Wollensky prize like a heat-seeking missile.  🙂

Announcing the Podder Skinning Competition

April 27, 2008

I am excited to announce that I am hosting a new WPF competition!! This contest allows you to create and submit your own skin for Podder, the WPF podcast player application. Since Podder was built to support “structural skinning” it can use any UI that you dream up to display its data and behavior. This contest will allow participants to focus on using WPF to create an awesome user experience, without needing to worry about writing the underlying application functionality.

The Podder Skinning Competition, along with all the rules, prizes, and dates, is fully explained on this page of my blog. I also put together a step-by-step walkthrough of getting started with creating your own Podder skin, which you can check out here.

I look forward to seeing the creative Podder skins that people submit. This is a very exciting time to be a WPF developer or designer!

Podder v2 has been released!

March 5, 2008

Podder 2 (new skin)

After a lot of work, fun, and learning, I’m thrilled to announce that the next version of Podder has been released!! Podder is my WPF podcast player. I recently published a large article about the new version of Podder, how structural skinning works, the new binaries, new source code, a Silverlight screencast, and even an interview between Craig Shoemaker (host of Pixel8 and Polymorhpic Podcast) and Grant Hinkson (the Visual Designer who made Podder’s new skin).

Download Podder v2 here. (NOTE: You must change the file extension from .DOC to .ZIP and then decompress. Requires .NET Framework 3.5 to run.)

View the article and download the source code here.

Please kick it on DotNetKicks.com for me!

Watch the screencast here.

Listen to the interview here.

Grant really did an incredible job on the new skin. It was an amazing experience to work so closely with an accomplished Visual Designer.

Deleting an image file displayed by an Image element

February 21, 2008

This blog post discusses one way to deal with the fact that, by default, a BitmapImage object holds a lock on the source image file. Along the way we will see what inspired this solution.

I have been working away on Podder, my WPF podcast player. Grant Hinkson, my favorite Visual Designer in the world, has spent some of his scarce free time creating a truly phenomenal skin for Podder. His work has revealed shortcomings and oversights in the Podder design, which I have been diligently working on and resolving.

Every podcast has an associated image, which is linked to via the podcast’s RSS feed. Grant’s Podder skin represents a podcast by showing it’s image. When I first added in support for providing the image of a podcast, I simply exposed a property on my Podcast class that returned the URL of the image. This worked OK for my skin, since it only shows one image at a time. For Grant’s skin, however, this did not cut it. His UI shows multiple podcast images at the same time. When the app first loaded with his skin applied, it would take quite a while for those images to be downloaded and displayed. Subsequent loads with his skin, during the same run of the app, would be fast because WPF caches images by default.

I decided to address this issue by saving each podcast’s image to disk, and then always load the image from disk (instead of downloading it every time you run the app). Getting the image saved to disk was easy:

Image File (download)

The tricky part was a little more subtle. When the user removes a podcast from Podder’s list of podcasts, I feel morally obligated to delete that podcast’s image file from their disk. I suppose it isn’t truly necessary, but I’m not a fan of apps that lazily leave garbage floating around on my disk, eating up space.

This moral quandary resulted in a call to File.Delete(theImageFile). Unfortunately, this did not work. It turns out that the BitmapImage, which is used by an Image element, holds a lock on the image file that you pass as it’s source. If you try to delete the file, an exception is thrown letting you know that you’re being a very naughty developer.

Naturally, the first thing I did was search the Web for more info about this problem. I came across an excellent solution for the problem here. Ralph’s solution involves a custom value converter that adjusts the BitmapImage’s caching behavior, so that it does not put a lock on the image file after the image has been loaded. That’s a very clean and simple solution, but I didn’t want to use it. One of my goals in designing Podder is that it should be as simple as possible to skin it. I’m actually toying with the idea of hosting a competition where people make their own Podder skin(s), and then submit them as entries to be judged and possibly awarded prizes. So I need to keep the skinning process as simple as possible. Having to use some obscure value converter on Image sources does not jive with that objective.

I was stumped. I needed to be able to delete image files for podcasts that were removed from Podder, but attempting to delete an image file resulted in an exception being thrown. What to do? I stepped away from the computer, sat down at the piano, and improvised. The solution dawned on me after playing this lovely little tune:

Josh Smith Piano Improv [2-21-2008]

In an inspired moment, I ran back to my laptop and modified my PodcastImageCache class a bit, so that instead of attempting to immediately delete an image file when told to, it stored the image file path in a list.

Image File (pre-delete)

I added the PodcastImageCache object to the application’s object graph that gets serialized by the BinaryFormatter as it shuts down. When the PodcastImageCache object is serialized that list of image file paths gets saved, too. I then used the magical OnDeserialized attribute to specify a callback to be invoked when Podder starts up again, and the PodcastImageCache object is deserialized.

Image File (delete)
Since the object graph is deserialized before the UI has a chance to come back to life, I am certain that none of the image files will be locked by the UI at the time this code runs. Perhaps this solution is overkill for most apps, but if you need to maintain absolute simplicity in the UI layer then this approach has value.

Podder v2 Beta

February 10, 2008

Just over a month ago I introduced my WPF podcatcher project, Podder. Shortly after the initial release of Podder I began collaborating with Grant Hinkson, Visual Designer extraordinare. He has been working on a new skin for Podder, actually a new “structural skin,” as I call it. I designed Podder to allow for structural skinning, meaning the entire UI can be swapped out at runtime or compile time. It has been very exciting to see Grant turn Podder into a thing of true beauty, by substituting my UI with his own! 😀

Part of this process has required me to change the way Podder works, as well as implement several new features. At this point, I have implemented all of the new functionality and refactored some of the previous code. I’m not sure how long it will take Grant to finish his Podder skin, so I decided to release the new build of Podder as a beta.

Here it is: Podder v2 Beta

NOTE: You will need to change the file’s extension from .DOC to .ZIP and then decompress it. This is a workaround for a limitation imposed by WordPress. Podder requires .NET 3.5

If you have already been using Podder, you must erase the files it stores in your AppData/Local/Podder directory. On my Vista machine, those files are located here:


I am not sure where the equivalent directory would be on XP.  If you do not delete those files, Podder will not work correctly.

I added quite a few features between v1 and v2. Here are some of the big ticket items:

  1. Vastly improved podcast management dialog.
  2. The Podder process runs at a high priority so that it does not freeze under heavy CPU load (thanks to Marlon Grech for that tip).
  3. Episode tooltips now contain a summary, duration, file size, and more.
  4. The app has a system tray icon and minimizes to the system tray.
  5. No matter which podcast is selected, you can click on a link to return to the active episode.
  6. The app detects when it does and does not have internet access (hacky…).
  7. The app can load and apply skins from DLLs at runtime (this feature is disabled in the Beta).
  8. Lots of tweaky bug fixes and better error handling.

Here are some screenshots of the Podder v2 Beta, still using my plain old skin. Click on the images to view them at full size.

Podder’s main window

Podder v2 Beta (Main Window)

Podder in the system tray

Podder v2 Beta (System Tray Icon)

Adding a new podcast to your list – Processing…

Podder v2 Beta (Processing New Feed)

Adding a new podcast to your list – Finished!

Podder v2 Beta (Podcast Added)

I hope you have as much fun using Podder v2 Beta as I had making and using it. If you find any bugs, please drop a comment on this post and let me know. I appreciate all the help I can get. 🙂

By the way, I have seen the skin that Grant is making. OMG it looks good! Once it is ready, I will write the next article in the Podder series on CodeProject, and show you why WPF rocks so hard!