Alessandro Del Sole's Blog

{ A programming space about Microsoft® .NET® }
posts - 1907, comments - 2047, trackbacks - 352

My Links

News

Your host

This is me! Questo spazio è dedicato a Microsoft® .NET®, di cui sono molto appassionato :-)

Cookie e Privacy

Disabilita cookie ShinyStat

Microsoft MVP

My MVP Profile

Microsoft Certified Professional

Microsoft Specialist

Xamarin Certified Mobile Developer

Il mio libro su VB 2015!

Pre-ordina il mio libro su VB 2015 Pre-ordina il mio libro "Visual Basic 2015 Unleashed". Clicca sulla copertina per informazioni!

Il mio libro su WPF 4.5.1!

Clicca sulla copertina per informazioni! E' uscito il mio libro "Programmare con WPF 4.5.1". Clicca sulla copertina per informazioni!

These postings are provided 'AS IS' for entertainment purposes only with absolutely no warranty expressed or implied and confer no rights.
If you're not an Italian user, please visit my English blog

Le vostre visite

I'm a VB!

Guarda la mia intervista a Seattle

Follow me on Twitter!

Altri spazi

GitHub
I miei progetti open-source su GitHub

Article Categories

Archives

Post Categories

Image Galleries

Privacy Policy

WinRT: lanciare applicazioni da codice, incluse le mappe

Come in ogni contest applicativo, anche le Windows Store Apps per Windows 8 possono avere la necessità di avviare altre applicazioni, siano esse Store App o applicazioni desktop.

Nel mondo .NET classico, siamo abituati a usare Process.Start o un'istanza di Process per gestire l'avvio di applicazioni esterne.

In Windows Runtime, non è così nel senso che non possiamo lanciare applicazioni in modo arbitrario. In WinRT si lanciano gli URI, che già sapete cosa sono, per ciascuno dei quali è associato uno schema.

Ad esempio, lo schema http:// farà si che venga aperto il browser predefinito per l'URI specificato. Questo è forse scontato, ma magari non sapete che lo schema bingmaps:/// è registrato e consente l'apertura di mappe per la query string specificata.

L'avvio di app esterne avviene attraverso metodi della classe Windows.System.Launcher. Il primo metodo che consideriamo è LaunchUriAsync. Questo metodo si usa con schemi per protocolli Web, come ad esempio http:// e mailto:. Se il protocollo utilizzato è http, verrà sempre avviato il Web browser predefinito indipendentemente dal contenuto. Il seguente codice mostra un esempio di come aprire un sito Web:

    Private Async Function ViewInBrowserAsync() As Task
        Dim webSiteUri As New Uri("http://www.microsoft.com")
        Dim result As Boolean = Await Windows.System.Launcher.LaunchUriAsync(webSiteUri)
 
        If result = True Then
            'operazione andata a buon fine
        Else
            'operazione fallita
        End If
    End Function

Se invece il protocollo è mailto: verrà aperto il programma di posta elettronica predefinito (nel mio caso Outlook 2013, quindi applicazione desktop):

    Private Async Function SendEmailAsync() As Task
        Dim mailMessageUri As New Uri("mailto:alessandro.delsole[@]visual-basic.it")
        'Apre il client di posta
        Dim result As Boolean = Await Windows.System.Launcher.LaunchUriAsync(mailMessageUri)
 
        If result = True Then
            'operazione andata a buon fine
        Else
            'operazione fallita
        End If
    End Function

Molto più interessante è la possibilità di aprire l'app delle mappe di Bing, sfruttando il protocollo bingmaps:///. Il seguente codice mostra come avviare l'app delle mappe e mostrare tutti i ristoranti della città di Cremona:

    Private Async Function ShowMapAsync() As Task
        Dim mapUri As New Uri("bingmaps:///?q=ristoranti&where=cremona")
        'Apre l'app delle mappe
        Dim result As Boolean = Await Windows.System.Launcher.LaunchUriAsync(mapUri)
 
        If result = True Then
            'operazione andata a buon fine
        Else
            'operazione fallita
        End If
    End Function

Dove q indica cosa cercare e where indica dove cercarlo. Non è una cosa da sottovalutare, ho visto fare questa domanda molte volte. Lo schema delle mappe e le relative query string sono descritti qui.

Diverso è il discorso per i file, visto che non esiste un protocollo specifico. Esiste, però, un metodo chiamato LaunchFileAsync che permette di aprire il programma predefinito per l'estensione del file specificato. Tenuto conto della sandbox in cui girano le Windows Store Apps, il seguente codice mostra come aprire un file di pertinenza dell'applicazione:

    'Richiede Imports Windows.Storage
    Private Async Function OpenFileAsync() As Task
        Dim myFile As StorageFile = Await Package.Current.InstalledLocation.GetFileAsync("MioDocumento.pdf")
 
        If myFile IsNot Nothing Then
            Dim result = Await Windows.System.Launcher.LaunchFileAsync(myFile)
            If result = True Then
                'Operazione riuscita
            End If
        End If
    End Function

Il metodo in questione vuole un oggetto di tipo StorageFile, che rappresenta un file contenuto nello storage riservato all'applicazione. Questo per ragioni di sicurezza, ovviamente una Windows Store App non può e non deve andare a prendere file in giro per il sistema. L'oggetto Package.Current rappresenta l'istanza del package dell'applicazione, InstalledLocation ovviamente la posizione su disco e GetFileAsync permette di ottenere un riferimento al file. Il metodo LaunchFileAsync, a questo punto, non farà altro che avviare il programma predefinito per quel file.

Alessandro

Print | posted on martedì 7 maggio 2013 19:50 | Filed Under [ UWP e Windows Store Apps ]

Powered by:
Powered By Subtext Powered By ASP.NET