Filetype APP Activation in Windows 8

Windows 8 METRO Styled APPS können auf viele Arten gestartet werden. Der Benutzer clickt die Kachel (Tile) und startet diese neu. Durch wipen (touch streichen) von Links nach Rechts wir eine schlafende APP (suspended) wieder in den Zustand aktiv versetzt. Eine weitere Möglichkeit ist es die Anwendung per Contract zu starten. So kann einen Suche direkt in einer Anwendung ausgeführt werden ohne diese per Hand zu starten. Über die sogenannte Live Tiles Funktion kann die Anwendung auch Logik ausführen die per Push (Windows Push Notifications -WNS) oder Timer gesteuert wird.

Doch die überraschende Neuerung ist über die Datei Erweiterung, die sogenannte File Type Association. Es gibt auch eine Protokoll Type Association.

In beiden Fällen wird Ihre Anwendung gestartet wenn ein Ereignis eintritt. Eben wenn eine Datei mit einer bestimmten Erweiterung im Explorer oder per Code geöffnet wird. Dies ist eigentlich auch die einzige Möglichkeit in WinRT aus einer Anwendung heraus eine andere APP zu starten.

Folgender Code ruft bei mir Notepad auf und öffnet die Datei. Die Datei muss im Verzeichnis eigen Dokumente liegen.

Private Async Function Button_Click_2(sender As Object, e As RoutedEventArgs) As Task
        Dim file = Await Windows.Storage.KnownFolders.DocumentsLibrary.GetFileAsync("vorname.txt")
        Await Launcher.LaunchFileAsync(file)
 End Function

Wenn das nicht klappt, sollte man in Visual Studio 11 Output Window nachsehen.

image

A first chance exception of type 'System.UnauthorizedAccessException' occurred in mscorlib.dll

Weniger gute verstecke Exception. Jede Datei Erweiterung muss in der Anwendung bzw. Manifest erst frei gegeben werden (Package.appxmanifest), sonsts krachts.

Der VB.NET Sample Code ist nun

 Dim file = Await Windows.Storage.KnownFolders.DocumentsLibrary.GetFileAsync("hannes.hannes")
Await Launcher.LaunchFileAsync(file)

Die Erweiterung .Hannes wird in der Anwendung erlaubt.

image

Nun läuft das Winrt Beispiel. Allerdings brauche ich nun noch eine zweite APP die auf den Click reagiert. (man kann das auch in einer lösen).

Also eine neues Visual Studio Projekt anlegen. Dort wird ebenfalls eine Filetype Association angelegt für .hannes.

image

Auf der XAML Seite BlankPagewird eine Textbox angelegt, die dann den Pfad und Namen der geclickten Datei anzeigen soll. die ersten vier Zeilen sind einfach aus dem allgemeinem OnLauched Event kopiert.

Der Typ Cast ist nötig um auf die Eigenschaften des Objektes BlankPage zu kommen. Die args liefern die Datei(en) und wir nehmen einfach die erste. In Files gibt es die passende Eigenschaft Path. Es gibt auch weitere Propertys die Dateitypisch sind wie Datecreated oder Name.

    Protected Overrides Sub OnFileActivated(args As FileActivatedEventArgs)
        Dim rootFrame As New Frame()
        rootFrame.Navigate(GetType(BlankPage))
          Window.Current.Content = rootFrame
        Window.Current.Activate()
         Try
            Dim b As BlankPage = DirectCast(Window.Current.Content, Windows.UI.Xaml.Controls.Frame).Content
            b.text1 = args.Files(0).Path
        Catch
        End Try
    End Sub

In der Code Datei BlankPage.xaml.vb ist hilft ein Setter des Propertys Text1 die private Textbox nach außen zu öffnen.

NotInheritable Public Class BlankPage
    Inherits Page
    Private _text1 As String
    Public WriteOnly Property text1() As String

        Set(ByVal value As String)
            textbox1.Text = value
        End Set
    End Property

 

Wenn wir nun in APP1 den Button clicken, konnte man Daten in einer Datei ablegen und diese automatisch (ohne Contract!) in APP2 anzeigen lasse, ohne diese er Hand zu starten.

Kommentar schreiben