Bing Maps e WPF

Mi è capitato di dover sviluppare una applicazione desktop usando il WPF che visualizzasse le mappe di Bing.
Pensavo sarebbe stato facile (“E’ tutto di Microsoft, sarà sicuramente facile”, pensavo) ed invece con qualche rapida ricerca su internet mi sono reso conto che non esiste un metodo “standard”, semplice e supportato direttamente da Microsoft di fare ciò.

Ho cercato un po’ di documentazione, e vagliato almeno due possibilità

  • Scrivere una semplice applicazione Silverlight, renderla disponibile su qualche server ed usarla all’interno di una window WPF (ma anche l’embedding di Silverlight in WPF non è a noi “concesso” da Microsoft in modo nativo)
  • Scrivere una pagina HTML ed interagire con essa tramite Javascript.

La soluzione che ho scelto di utilizzare è la seconda: più semplice e senza necessità di hostare niente su un server.

Partiamo con un po’ di documentazione:
Qui potete trovare un esempio di utilizzo dei servizi SOAP di Bing.
Qui trovate un esempio di interazione tra WPF e WebBrowser tramite javascript.

Il progetto di esempio, che potete scaricare in fondo a questa mini-guida, è composto principalmente da una pagina HTML che si occupa di visualizzare le mappe di Bing e da una finestra WPF che interagisce con la pagina HTML fornendo coordinate e ricevendo informazioni da essa.
La classe che permette la conunicazione tra WPF e Javascript è la seguente:

[PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
[ComVisible(true)]
public class ObjectForScriptingHelper
{
    Window1 mExternalWPF;
    public ObjectForScriptingHelper(Window1 w)
    {
        this.mExternalWPF = w;
    }

    public void ActionChanged(string action)
    {
      this.mExternalWPF.ActionChanged(action);
    }

    public void PinAdded(string latitude, string longitude)
    {
      this.mExternalWPF.PinAdded(latitude, longitude);
    }
}

Come vedete è molto semplice. Da notare soltanto i metodi ActionChanged e PinAdded, che sono quelli che verrano chiamati da Javascript per comunicare con il programma principale.

La pagina HTML usa i normali metodi AJAX utilizzati sul web.
Qui potete trovare molti esempi di utilizzo.

La parte WPF non fa altro che visualizzare il contenuto HTML in un controllo WebBrowser, comunicando con essa attraverso Javascript.

Visto che un esempio vale più di mille parole, ecco il progetto di test.
BingMapsTest

Per poterlo utilizzare dovete registrare un account al Bing Maps Account Center ed inserire la chiave nella costante:

private const string m_BingKey = "Your Bing Maps Key";