UWP Share Target Teil 1

Seit Windows 8 können Anwendungen über Contracts Daten jeder Art austauschen. Dabei wird das Ziel automatisch aktiviert wenn der Benutzer seine Daten sharen möchte. Wenn man so möchte eine Super Zwischenablage.

Aus der Bilder Anwendung mit dem Share Symbol von rechts eine Leiste mit möglichen Zielen (Apps) eingeblendet.

image

Normalerweise findet sich dort zb die Mail App. So kann das Bild per Mail verschickt werden, ausgehend vom Bild.

image

Mein Visual Studio 2015 UWP (universal windows Plattform) Projekt – p2p taucht hier auf, weil schon wie bei Windows 8 Winrt das Manifest dies definiert. Einfach die Datei package.appxmanifest doppelklicken und man erhält folgenden Dialog

image

Eingetragen wurde hier im Reiter Deklarationen ein Freigabeziel (Share Target). Da die App als Empfänger für Bilder auftauchen soll, wird als Datenformat (Data Format) die Zeichenkette “Bitmap” eingetippt. Etwaige Dateitypen werden in der Notation . Endung eingetragen.

Für den nächsten Schritt müssen in der App.xaml.cs einiges an Code geschrieben werden. Das nimmt einen aktuell leider kein Assistent ab.

Zunächst muss ein Aktivierungs Event überschrieben werden, in dem die noch zu erzeugende XAML Page (sharedialog1) initialisiert wird.

   1:   Protected Overrides Sub OnShareTargetActivated(ByVal args As Windows.ApplicationModel.Activation.ShareTargetActivatedEventArgs)
   2:          Dim rootFrame = CreateRootFrame()
   3:          rootFrame.Navigate(GetType(ShareDialog1), args.ShareOperation)
   4:          Window.Current.Activate()
   5:      End Sub

Die Hilfsmethode CreateRootFrame kopiert man sich einfach ins Projekt.

   1:   Private Function CreateRootFrame() As Frame
   2:          Dim rootFrame As Frame = Window.Current.Content
   3:          If rootFrame Is Nothing Then
   4:              rootFrame = New Frame()
   5:              rootFrame.Language = Windows.Globalization.ApplicationLanguages.Languages(0)
   6:              AddHandler rootFrame.NavigationFailed, AddressOf OnNavigationFailed
   7:              Window.Current.Content = rootFrame
   8:          End If
   9:          Return rootFrame
  10:  End Function

Im nächsten Schritt wird die XAML Page ShareDialog1 dem Projekt hinzugefügt. Für erste Tests wird eine einfache Textbox dort platziert. Dann gehts weiter zu Code. Die wichtigste Deklaration ist die ShareOperation.

   1:   Private _shareOperation As DataTransfer.ShareTarget.ShareOperation
   2:   Private quelleTitel As String
   3:   Private bitmapstream As Windows.Storage.Streams.IRandomAccessStreamReference
   4:   Private sharedStorageItems As IReadOnlyList(Of IStorageItem)

Das klassische Debugging kann man übrigens quasi abschreiben. Sobald man einen Breakpoint erreicht, verliert der ShareDialog den Fokus und schließt sich. Bester mir bekannter Workaround sind vielfältige Debug Writeline Varianten.

Konzepteptionell fängt man sich das OnNavigatedTo Event der Page und holt sich eine Referenz auf die ShareOperation. Etwas krud benötigt man nun einen Thread und wenn der fertig ist einen Dispatcher um das UI zu aktualisieren.

   1:   Protected Overrides Async Sub OnNavigatedTo(e As NavigationEventArgs)
   2:          _shareOperation = CType(e.Parameter, ShareOperation)
   3:          Await Task.Factory.StartNew(Async Function()
   4:                                         .....
   5:   
   6:                     Await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, Sub()
   7:                                                                       ......
   8:   
   9:                                                                              End Sub)
  10:                                      End Function)
  11:   
  12:   End Sub

Nun könnte man die Eigenschaften des übermittelten Objektes auslesen. Allerdings nicht ganz so, wie man es erwartet. Title aus Zeile 1 ist der Name der Sender Anwendung. Weiters würde man erwarten, das es sich um ein Bitmap handelt und die Verzweigung in Zeile 3 landet. Tut es aber nicht, dafür erhält man eine Liste von Storageitems und kann dort auf Eigenschaften zugreifen.

   1:    quelleTitel = _shareOperation.Data.Properties.Title
   2:    If (_shareOperation.Data.Contains(StandardDataFormats.Bitmap)) Then
   3:           bitmapstream = Await _shareOperation.Data.GetBitmapAsync()
   4:    End If
   5:    If (_shareOperation.Data.Contains(StandardDataFormats.StorageItems)) Then
   6:            sharedStorageItems = Await _shareOperation.Data.GetStorageItemsAsync()
   7:    End If
   8:    Await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, Sub()
   9:                              bildname.Text = sharedStorageItems.First.Name
  10:                                            'quelleTitel
  11:                                                            End Sub)

 

Als nächstes fehlt noch die Behandlung ob der Shareing als Erfolgreich oder Misserfolg gewertet wird, Dazu gibt es Events wie ReportCompleted. Das aber an einem anderen Tag oder in meiner Windows 10 UWP Schulung.

Kommentare sind geschlossen