Aussie Forecast

Friday, 9 May 2014

My latest app for Windows Phone is now available in the store – Aussie Forecast!

Aussie Forecast Lock Screen

Windows Phone 8 supports apps displaying custom information on the lock screen. The Bing Weather app is a nice example, but I was frustrated by the inaccurate forecast data that it was using. Not the first time I've seen this problem.

So I thought I'd create my own app that uses the Australian Bureau of Meteorology's data to display the forecast for a selected location. You can optionally choose to have the forecast displayed on your phone's lock screen, and a background task runs at regular intervals to keep the information current.

Application main page screenshotSettings screen

Future enhancements will include allowing a user-selected photo for the background image or the daily Bing Photo.

If you've got a Windows Phone 8 device, then please try it out!

Download from the Windows Phone Store

Using BugSense for Windows Phone with Caliburn.Micro

Sunday, 4 May 2014

BugSense is a 3rd party service I came across recently being promoted on Nokia's (now Microsoft's) DVLUP site. They provide aggregation and reporting of errors from your apps.

All of the usual platforms are supported, and conveniently they provide NuGet packages to facilitate integrating with Windows Phone 7, 8 and Windows Store apps.

I like using Caliburn Micro (CM) for most of my Windows Phone apps to help with using the MVVM pattern, and one of the requirements for using CM is to strip out the contents of the App.xaml.cs file's constructor, leaving just

public App()
{
    // Standard XAML initialization
    InitializeComponent();
}

The BugSense instructions however assume you're using a regular Windows Phone project that has the original App.xaml.cs contents. The workaround I've settled on is to add the BugSense code to the body of the Configure method in the CM AppBootstrapper class.

First, add the BugSense namespaces:

using BugSense;
using BugSense.Core.Model;

Then initialise BugSense (replacing API_KEY with the key displayed when you click on 'Help me integrate' on the BugSense site:

protected override void Configure()
{
    // Initialize BugSense
    BugSenseHandler.Instance.InitAndStartSession(new ExceptionManager(App.Current), RootFrame, "API_KEY");

You might also wish to add logging of handled exceptions too:

catch (Exception ex)
{
    BugSenseLogResult logResult = BugSenseHandler.Instance.LogException(ex);

    // Examine the ResultState to determine whether it was successful.
    Debug.WriteLine("Result: {0}", logResult.ResultState.ToString());

    Debug.WriteLine(ex);
}

In a future post I hope to describe logging exceptions for background tasks.

var article = new State();

Sunday, 6 April 2014

What an interesting time to be a .NET developer!

In the last week, Microsoft held its now annual Build conference and announced a whole bunch of new product offerings and features. For most of us who can’t get there in person, downloading and watching the session videos is almost as good. All of the keynote and session videos are (or soon will be) available on the Channel 9 Build 2014 event page

Build doesn’t just focus on .NET – it tends to cover developer topics that relates to any Microsoft technology – Windows desktop, Phone, Web and Azure (cloud).

Open sourcing

I remember having a conversation with Dan Shearer many years ago. Dan is a big advocate of open source software. I surprised him at the time by telling him about this XML-based installer software that Microsoft had made open source and hosted on SourceForge (10 years ago). I think this was still when other parts of Microsoft were still quite anti-open source. 10 years on, things have changed quite a lot.

We have not only the OuterCurve Foundation, but now just announced at the Build conference, the .NET Foundation to promote and ‘steward’ a collection of open-source technologies for .NET. Curious that they created a second foundation, but what ever gets the job done I guess.

The biggest thing in this area for me was the announcement that the new .NET C# and VB compilers (aka ‘Roslyn’) would become open source. They’re up now on CodePlex - http://roslyn.codeplex.com/ (and yes, they’re taking pull requests too)

My how things have changed!

8.1

Windows 8.1 Update 1 is out, and Windows Phone 8.1 is coming in the next few months. Apart from the new phone features, I think the big news here is the new “Universal” applications that make it simpler to develop a single app that works on both Windows Phone and Windows Store (aka Metro). Laurent Bugnion has more info on his blog. This is nice – though it only works for 8.1 so it doesn’t necessarily solve the problem of supporting older platforms (eg. Windows Phone 7 or the current Windows Phone 8 before the upgrade is released)

Azure

Watching the Day 2 keynote with Scott Guthrie impressed me with how much is going on in Azure land. I feel like I really need to get more familiar with this stuff.

Other highlights

That will do for now – I’ve got some more videos to watch (if our monthly internet quota doesn’t get used up – I already managed to lose all my phone’s data quota when it decided to use 3G instead of the home wireless to stream the keynote Sad smile)

Farewell MCT

Friday, 7 March 2014

I first became a Microsoft Certified Trainer back when I was working at LobsterPot Solutions. Teaching is something I quite enjoy, though the opportunities are limited. The only times I've been using my MCT status in the last few years was to be able to attend the Microsoft TechEd conferences as a hands-on labs trainer.

Recently, Microsoft announced some changes to the MCT programme, including that MCTs must teach at least one course a year, and that receive a training quality score (feedback) of at least 6.

As it's been a few years since I last taught a course, I won't be able to renew my MCT this year. They have introduced an 'MCT Alumi' programme for inactive trainers, which I would qualify for, but I haven't decided if there's value in me doing that.

Extending WinForms controls

Sunday, 2 February 2014

I've been looking at ways to extend and enhance .NET WinForms controls recently and thought I'd summarise what I've found/learned so far.

Inheritance

The most obvious way to extend a control is to create a new class that inherits from the existing class. You then have full access to add new properties and methods and access any protected methods from the base class.

It does mean that if you've already used the control in your application, you're going to have to replace references to the base class with your new class – not always easy.

IExtenderProvider

Properties window showing Tooltip propertyAnother option is to create a class that implements the IExtenderProvider interface. You can then create a component that can be added to a form or user control that extends specific types. An example of this that ships in the framework is the ToolTip class. When you drag this control onto a form it doesn't add a visible control to the design surface. Instead it adds a new ToolTip property to appropriate controls on the same form.


Custom ComponentResourceManager

Visual Studio designer showing properties window with Localizable set to trueA more specific area of WinForms controls that you might want to customise is the localisation support. Localisation for controls on a form is enabled by setting the Localizable property of the form to true. This also alters the designer-generated InitializeComponent method to add a new resources variable of type System.ComponentModel.ComponentResourceManager. This allows you to use .resx resource files to load locale-specific values for properties. This is the standard way that you would provide alternate language translations for your application.

A question on Stack Overflow asked about replacing this implementation with another that could load resources from an alternate location (such as an XML file or a database). The accepted answer pointed to some samples from Guy Smith-Ferrier's book, .NET Internationalization: The Developer's Guide to Building Global Windows and Web Applications.

Impressively, even though the book was published in 2006 Guy has been releasing regular updates to the code samples at http://www.dotneti18n.com/Downloads.aspx. His sample for a custom ComponentResourceManager includes a ResourceManagerSetter class that has the DesignerSeralizer attribute. This was new to me, but it turns out this is the mechanism that generates the code that appears in a forms's .Designer.cs file. This uses the CodeDom to generate code that inserts the replacement ComponentResourceManager instance.

private void InitializeComponent()
{
    System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(UserControl1));
    this.resourceManagerSetter1 = new Internationalization.Resources.ResourceManagerSetter();
    this.label1 = new System.Windows.Forms.Label();
    this.SuspendLayout();
    Internationalization.Resources.ResourceManagerProvider.GetResourceManager(typeof(UserControl1), out resources);
    // 
    // label1
    // 
    resources.ApplyResources(this.label1, "label1");
    this.label1.Name = "label1";
    // 

Using CodeDom means that the code is generated for the appropriate language automatically. The only requirement is that this component must be the first one added to the form. If you're adding this to an existing form with controls, just go to the Designer.cs file and move the line calls the constructor to the top of the InitializeComponent method. (The order of the calls to the constructors seems to determine the order in which the serialized code generators are called)

You can see from the code sample above that the original instantiation is still there, but is effectively replaced by the call to the GetResmourceManager method.

MSDN has more info on Globalizing Windows Forms.