Windows 8 App – Share Source und MVVM Überlegungen
WinRT – Easy Animation
Apps für Mobile geräte leben mehr von ihrem Look and Feel, als andere Anwendung.
Umso wichtiger ist es sinnvolle und dem Anwender helfende Animationen, sogenannte Transitions zu verweden.
Wer sich in WPF mit Transitions und Storyboards beschäftigt hat, weiß dass hier schnell viele Zeilen Code entstehen.
Wer nun kein Blend hatte musste hier einiges an zeit investieren und selbst Blend war nicht ganz streßfrei.
Dabei werden meistens immer wieder die gleichen Animationen benötigt.
Nun wurde für Windows 8 Apps dieses Handling vereinfacht.
Nachfolgend ein Markup der Dafür sorgt, dass Elemente, die Horizontal angeordnet werden beim Erscheinen nicht einfach plötzlich da sind, sondern von Rechts einfahren.
<ItemsControl.ItemsPanel> <ItemsPanelTemplate> <StackPanel Orientation="Horizontal" ScrollViewer.HorizontalScrollBarVisibility="Auto"> <StackPanel.ChildrenTransitions> <TransitionCollection> <EntranceThemeTransition IsStaggeringEnabled="True" FromHorizontalOffset="150"/> </TransitionCollection> </StackPanel.ChildrenTransitions> </StackPanel> </ItemsPanelTemplate> </ItemsControl.ItemsPanel> </ItemsControl >
Das Control an sich ist recht unspektakulär aber Demonstriert den Anwendungsfall sehr gut
Unter http://msdn.microsoft.com/de-de/library/windows/apps/jj218361.aspx gibt es eine gute Übersicht der zur Verfügung stehenden Standard Transitions.
Weiterhin gibts es unter http://msdn.microsoft.com/de-de/library/windows/apps/xaml/hh452703.aspx einen Leitfaden wie man die Transitions einsetzen kann / sollte
Es gibt eine ganze Reihe an vorgefertigten Animationen. Ausserdem findet man einige weiterer guten Informationsquellen.
z.bsp.:
- MSDN
- Windows Store example XAML personality animations sample
- Windows Store example XAML animation library example
Windows 8 App – ShareSource – Bereitstellen von Daten
In diesem Blogbeitrag sehen wir uns an, wie man Daten mit anderen Anwendungen teilen kann.
Das beginnt schon bei einem sehr häufigen inzwischen schon gewöhnlichen Vorgang.
Dem Verschicken von E-Mails
Mit einer Winform / WPF geprägten Sichtweise fällt uns da da direkt SMTP oder COM Automation des Outlookclient ein.
Interessanter wird wenn dann vielleicht noch die Mails über Notes verschickt werden sollen. Wer sich mit diesen Themen schonmal beschäftigt hat weiß wie schnell das Aufwendig und Problematik werden kann.
Dieses Denken passt aber auch gar nicht wirklich zu Windows 8. Hier ist in der Regel alles von einander getrennt und Funktioniert autark.
Nach einem Moment des Nachdenkens viel mit der “Teilen” Button in Windows 8 ein.
Um sich diese Funktion zu nutzen zu machen gibt es den ShareContract.
Hierrüber ist es möglich Daten teilen oder empfangen zu können.
Hierbei gibt es 2 Richtungen.
1.) Daten aus einer anderen App empfangen
2.) Daten an andere Apps senden
In diesem Fall wird nur das senden benötigt. In diesem Fall ist die eigene App eine Share Quelle. Um Datenanbieten zukönnen benötigt man den DataTransfer Manager.
Der Ablauf ist relativ einfach.
Clickt man bei Windows8 Auf den Share Button
So wird am DataTransferManager das DataRequested Event getriggert. Diesen Manager muss man sich für jedes View Abrufen:
this.dataTransferManager = DataTransferManager.GetForCurrentView();
Zusätzlich muss man sich nun folgerichtig das Event binden
this.dataTransferManager.DataRequested += dataTransferManager_DataRequested;
Damit es hier nicht zu Fehlern kommt, sollte das event beim wegnavigieren wieder entbunden werden:
protected override void OnNavigatedFrom(Windows.UI.Xaml.Navigation.NavigationEventArgs e)
{
this.dataTransferManager.DataRequested -= dataTransferManager_DataRequested;
}
In der Methode die nun gebunden ist hab man die DataRequestEventArgs im zugriff. Über diese kann man dann die verschiedenen Werte setzen die man Teilen möchte
void dataTransferManager_DataRequested(DataTransferManager sender, DataRequestedEventArgs args)
{
DataPackage requestData = args.Request.Data;
requestData.Properties.Title = "Kontakt " + this.DisplayName + " teilen"; // Required!
requestData.Properties.Description = "Teilen der KontaktDaten";
requestData.SetText(contactDescription);
}
Als Ergebnis kann man nun aus den Anwendungen wählen, die Texte Empfangen können:

Clickt man nun auf eine der Apps, so geht der Client in seiner eigens definierten UI für dieses Share auf.
Für mein Empfingen ist dies ein deutlich besserer Workflow für das Handeln von Daten. Man hat keine Konkrete Abhängigkeit mehr zu Clients und kann so ohne Mehraufwand ein Wesentlich größeres Angebot an apps bedienen.
Der Workflow fühl sich reaktiver und damit weniger kompliziert an.
Zu beachten ist noch dass man nur eine begrenzte Zeit beim laden der Daten für den ShareContract zur Verfügung hat.
Dies kann man über das Deadline property abfragen.
Sind Asynchrone komplexere Vorgänge zu erledigen um die Daten für ShareContract zu ermitteln so sollte man einen Deferral benutzen
var deferral = args.Request.GetDeferral(); var image = await getImage(); requestData.SetBitmap(image); deferral.Complete();
Zum Abschluss möchte ich noch kurz davon berichten, dass bei meinen Tests mit Visual Studio manchmal die ShareUI hängen geblieben war. Man sah nur dass versucht wurde Daten aus der app abzurufen aber der Waiter lief bis ins unendliche. Zur gleichen Zeit lief aber kein Code in Visual Studio. Hier hald das neustarten des Rechners. Und exakt der gleiche Code lief dann ohne Probleme.
Hier noch 2 Beispiele aus der MSDN
Kiln Harmony – Mercurial und Git in einem !

FogCreek hat eine neue Version von Kiln released.
Sehr bezeichnender Weise heißt die Version “Harmony.
Passender weiße deswegen weil endlich das zusammen findet was meiner Meinung nach schon längst Zusammen gehört.
Kiln – Mercurial – Git.
Details findet ihr unter:
http://blog.fogcreek.com/announcing-kiln-harmony-the-future-of-dvcs/
Für alle die Tatsächlich noch nichts von Kiln oder Fogbugz gehört haben:
Es gibt eine Trial : https://www.fogcreek.com/kiln/try/
Training Videos:
- Kiln Training
- FogBugz Training
und eine kostenlose Student and Startup Edition
http://www.fogcreek.com/kiln/StudentAndStartup.html
Ausserdem sollte man folgende Videos gesehen haben:
- Joel Spolsky auf der FogBugz and Kiln Worldtour
Windows 8 App – Kontakte Picker
Ein Anwedungsfall meiner Anwendung ist das anlegen von Personen in der App.
Hierfür kann der User die Daten in Textboxen eingeben.
Nun gibt es in Windows 8 ja auch eine Kontakte App. Dort kann man all seine Kontakte aus den verschiedenen Bereichen, z. Bsp. Facebook sehen. Die Frage war nun wie kann man Daten die man in dieser App sieht in die eigene Anwendung bekommen.
Gregor Biswanger gab mir da den entscheidenden Tipp.
Es gibt einen ContactPicker der alle notwendigen Funktionen anbietet.
Dazu benötigt man nur wenige Zeilen Code un kann mittels der Methode PickSingleContactAsync oder PickMultipleContactsAsync einen oder mehere Kontakte abrufen lassen.
Somit kann man recht leicht die Daten eines Kontaktes abrufen und beliebig in die eigene App integrieren. Hier zum Beispiel das Übernehmen von E-Mail und InstantMessage Daten.
Hier gibt es noch ein SDK Sample dazu:
http://code.msdn.microsoft.com/windowsapps/Contact-Picker-App-sample-fc6677a1
Windows 8 App – DecodePixel
Unter dem nachfolgenden Link gibt es kurzen aber sehr guten Artikel von Gregor Biswanger zu dem Thema BitmapRessourcen ressourcen schonend nutzen:
Hintergrund ist, dass Bitmapimages oft größer vorliegen als sie angezeigt wird. Um nun nur noch soviel renden zu lassen wie man benötigt kann man die DecoderPixel setzen.
s.
BitmapImage bitmapImage = new BitmapImage();
bitmapImage.DecodePixelHeight = 430;
bitmapImage.DecodePixelWidth = 640;
bitmapImage.SetSource(stream);
Dies hat in meiner App einiges an Vorteile gebracht. Nochmal danke für den Tipp !
Windows 8 App – Lokalisierungen – Texte
Allgemeines
Was mich bei Windows 8 Apps mit am meisten Fasziniert ist der Windows 8 App Store. Erstellt man eine App und sei sie noch so einfach, so steht einem “die Welt” offen.
Allerdings muss man dafür sorgen dass die Anwendung von den Anwendern auch verstanden wird. Der erste schritt hierfür ist das lokalisieren von Texten.
Nun stellt sich natürlich die frage wie geht man das an ? Dieser Artikel widmet sich diesem Thema und einer möglichst einfachen ersten Lösung.
Wir schauen uns nachfolgend diese Themen an:
- Lokalisieren von Texten aus dem XAML
- Lokalisieren von Button aus den StandardStyles
- Lokalisieren aus dem Code.
Eine Auflistung der Unterstützten Sprachen findet man hier: Choosing your languages
Lokalisierungen über Uid’s
Da ich eine sehr einfache Anwendung habe, habe ich mich für die einfachste variante entschieden. Lokalisierung über ResourceFiles.
Hierfür legt man zunächst für jede unterstützte Kultur einen Ordner an. Für eine bessere Übersicht habe ich diese Ordner alle in einen Überordner “Localization” gepackt.
In diesen Ordnern legen wir nun RessourceFiles an.
Lokalisierungen im XAML
Als nächsten Schritt wollen wir den Text eines TextBlocks lokalisierbar hinterlegen. Dafür geben wir dem Textblock eine Uid
Diese Uid kann nun in den Ressource Files verwendet werden. Dazu verwendet man zuerst die Uid , in diesem Fall FencerFirstNameText, und schreibt dann das Property dem man einen Wert zuweisen will , hier .Text.
Man kann hier auch weitere Properties wie Height und Width verändern, wenn man zum Beispiel feststellt dass in einer bestimmten Kultur der Platz für den Text nicht reicht.
Möchte man Z. Bsp. den content eines Buttons lokalisieren kann man das so trägt man in dem Resource File lnks Uid.Content ein und rechts den Textwert. Beispiel siehe oben mit “btnWebcamImage.Content“
AppBarButtonStyles lokalisieren
Unter WinRT sehr beliebt sind die AppBarButtonStyles. Dort wird das eigentliche Image in den Styles über ein spezielles Font und einem dazu passenden Wert im Button Content gesetzt
z.bsp.
Hier können Wir nun nicht mehr einfach den Content lokalisieren, da dieser ja fix &#E156 sein muss.
Hier ein Beispiel eines solchen Buttons:

Ansonsten würde das Image nicht mehr in dem Button erscheinen. Wer nun aber genau hinsieht sieht in dem Style des Buttons dass der Text in AutomationProperties.Name hinterlegt ist. Dies ist aber kein Standard Properties des Buttons sondern ein Attached Property.
Um dieses in den Resources setzen zu können muss man einen speziellen Syntax zum referenzieren verwenden: nämlich
Uid.[using:Windows.UI.Xaml.Automation]AutomationProperties.Name
Wie man sieht fügt man in den Pbjektpfad ein Using auf den Namespace des AttachedProperties hinzu. Somit kann man dann den Wert setzen.
Das sieht dann so aus:
Lokalisieren aus Code
Möchte man nun aus dem Code heraus lokalisieren so kann man sich eine Instanz des ResourceLoaders erzeugen und über diesen zu den itentifiern die hinterlegten strings abrufen.
Z.bsp. so:
Achtung der ResourceLoader lädt im Standardverhalten die Resourcen immer aus der Anwendungsassembly. Hat man ein eigenes Assembly so muss man dies gesondert andegeben. Weitergehende Informationen zum ResourceLoader handling, ResourceMaps usw. findet man z.bsp. unter:
- http://msdn.microsoft.com/en-us/library/windows/apps/windows.applicationmodel.resources.resourceloader.aspx
- http://code.msdn.microsoft.com/windowsapps/Application-resources-and-cd0c6eaa/
In den nächsten Artikeln schauen wir uns das Lokalisieren von Bildern und Datumswerten an.








