11 Tipps und Tricks für die Entwicklung mit Windows Phone 7

.NET und Silverlight aufs Handy
Kommentare

Windows Phone 7 gibt es nun seit fast vier Monaten. Über 3 000 Applikationen befinden sich bereits im Windows Phone Marketplace, darunter namhafte Vertreter wie eBay, Amazon, Shazam und zahlreiche Spiele. Wollen auch Sie eine Anwendung für Windows Phone 7 entwickeln? In diesem Artikel geben wir Ihnen 11 hilfreiche Tipps für die Entwicklung für die neue Plattform.

Um Apps für Phone 7 zu schreiben, setzt Microsoft auf zwei bewährte Frameworks: XNA ist ein Frame-basiertes Zeichenmodell, das auf DirectX basiert und bereits auf Xbox und PC verfügbar ist. Silverlight hingegen baut auf Controls wie Buttons, Listen etc. auf und kommt aus der Webwelt. Wann soll nun was verwendet werden? Generell steht Ihnen die Wahl frei. XNA eignet sich für Applikationen, die hohe Grafikleistung z. B. mit 3-D erfordern, etwa Spiele. Silverlight hingegen ist eher für Geschäftsanwendungen mit vielen wiederverwendbaren Controls geeignet (Abb. 1). Dieser Artikel konzentriert sich auf die Entwicklung mit Silverlight.

Mit den Windows Phone Developer Tools  bekommen Sie kostenlos alle Werkzeuge, um für beide Frameworks entwickeln zu können. Das Downloadpaket enthält nicht nur die komplette Entwicklungsumgebung, sondern auch einen Emulator und zahlreiche Hilfsprogramme. Der Emulator ist die Miniversion einer virtuellen Maschine, die das Windows-Phone-7-Betriebssystemabbild ausführt. Dadurch ist er eine relativ genaue Abbildung der Software. Die normale Entwicklung können Sie also problemlos mit dem Emulator beginnen. Anders wird es jedoch, sobald es um die besondere Zusammenarbeit mit der Hardware geht. Für GPS, Bewegungssensoren, Kamera & Co sollten Sie sich ein echtes Endgerät anschaffen, um sie in Ihrer Anwendung testen zu können. Ein weiteres Thema ist natürlich die Performance Ihrer App: Auch hier lohnt es sich, ein echtes Phone zu besitzen, mit dem zumindest einmal täglich die Performance der Applikation verifiziert wird.

Jedes herkömmliche Windows Phone 7 kann zu einem Developer-Gerät aufgesperrt werden. Registrieren Sie dazu einen Entwicklungs-Account (Preis 99 $) und sperren Sie das Gerät mittels des „Windows Phone Developer Registration“-Werkzeugs aus dem SDK auf. Das Entwicklungswerkzeug für den Code der Phone-Applikationen ist Visual Studio 2010, das automatisch mit den Tools installiert wird. Damit können auch Silverlight-UI-Layouts gebaut werden. Will man aufwändigere Layouts mit Animationen oder besonderen Anpassungen der Controls, so muss man auf das ebenfalls im Download enthaltene Werkzeug Expression Blend 4 zurückgreifen, das für Screendesigner gedacht ist. Diese Trennung zwischen UI und Code finden Sie bei Silverlight auch in Ihrem Projekt wieder. Jede Applikation hat .XAML-Dateien, die das Layout definieren und .CS-Dateien, die den zugehörigen Code enthalten.

Fazit: Um mit der Entwicklung zu beginnen, benötigen Sie die die Windows Phone Developer Tools, die es kostenlos als Download gibt. Der Emulator ist für die rasche tägliche Entwicklung geeignet, ein Gerät zum Testen ist jedoch empfohlen. Jedes handelsübliche Phone kann über einen Developer Account freigeschaltet werden.

Die meisten Applikationen brauchen Daten aus dem Internet: Fahrpläne, Geodaten oder Filme im Kino sind nur einige Beispiele. Für den Austausch von Daten mit einem Server gibt es bei WP7 drei häufige Varianten:

  • Plain Old XML („POX“)
  • OData Services
  • SOAP Web Services

XML-Dateien laden und verarbeiten

Die einfachste, aber von der Entwicklung her aufwändigste Methode ist die erste – XML. Auf dem Server befindet sich eine beliebige XML-Datei, die mittels einer Downloader-Klasse heruntergeladen wird. Danach muss das XML in ein Objektmodell umgewandelt werden, das dann innerhalb der App verwendet werden kann (Listing 1).

private void PhoneApplicationPage_Loaded(object sender,
    RoutedEventArgs e)
{
    WebClient client = new WebClient();
    client.DownloadStringCompleted += client_DownloadStringCompleted;
    client.DownloadStringAsync(new Uri("http ://schabus.knor.net/rss"));
}
 
void client_DownloadStringCompleted(object sender,
    DownloadStringCompletedEventArgs e)
{
    if (e.Error == null && e.Cancelled == false)
    {
        // Download erfolgreich!
        // ACHTUNG: Wir blockieren hier UI Thread
        XDocument xdoc = XDocument.Parse(e.Result);
 
        IEnumerable comics = from el in xdoc.Descendants("item") select new Comic { Title = el.Element("title").Value }; } }

Man beachte den asynchronen Aufruf der WebClient-Klasse. Um nicht die App zu blockieren, können alle Funktionen, die Netzwerkressourcen verwenden, nur asynchron aufgerufen werden. Der jeweilige Event gibt eine Methode an, die ausgeführt wird, falls der jeweilige Download erfolgreich war. Dieses Codebeispiel funktioniert übrigens nicht nur für XML, sondern auch für alle anderen Dateiformate (Bilder, CSV, HTML …), die sich auf einem öffentlichen Webserver befinden.

OData und SOAP Web Services

Für serverseitige Web Services, die OData oder SOAP implementieren, gibt es leichtere Möglichkeiten als das manuelle Parsing: Mittels OData Client Proxy Tool oder dem eingebauten Add Service Reference-Menü für SOAP Web Services können Sie lokale Proxy-Klassen bauen, die sich automatisch um den Download und das Parsen in Klassen kümmert. Somit wird der Aufruf noch komfortabler (Listing 2).

ComicServiceClient client = new ComicServiceClient();
client.GetComicsCompleted += client_GetComicsCompleted;
client.GetComicsAsync();
...

void client_GetComicsCompleted(object sender,
    GetComicsCompletedEventArgs e)
{
    if (e.Error == null && e.Cancelled == false)
    {
        // Kein zusätzlicher Verarbeitungsaufwand
        IEnumerable comics = e.Result; } }

Fazit: Für den Download von Daten gibt es drei Varianten, je nachdem, wie die Datenquelle auf der Serverseite ausführt. Jeder Netzwerkzugriff passiert asynchron, um das UI nicht zu belasten.

Eine häufige Anwendung von Datenbindung ist die Anzeige von mehreren Elementen in einem ListBox Control. Listing 3 zeigt, wie Sie eine Liste von Comic-Objekten an eine ListBox binden.

// In XAML:
<Grid x:Name="ContentPanel">
    <ListBox ItemsSource="{Binding}" />
</Grid>

// In C#:
var comicListe = new List<Comic>();
// .. Befüllen der Comicliste z.B. über WebClient
this.ContentPanel.DataContext = comics;

Doch wie wird eine Klasse in einer Liste dargestellt? Schließlich handelt es sich hierbei um ein Datenobjekt, das Eigenschaften besitzt, jedoch keine Informationen über dessen Darstellung. In Silverlight heißt die Lösung für das Problem Templates. Templates bieten die Möglichkeit, das Aussehen fast aller Silverlight Controls anzupassen – und das ziemlich detailliert. So auch bei der ListBox: Abbildung 2 verdeutlicht die einzelnen Templates der ListBox in zwei unterschiedlichen Anwendungsfällen.

Abb. 2: Zwei unterschiedliche Ausrichtungen von Item Templates

Das Item Template regelt die Darstellung eines einzelnen Elements der Liste – in unserem Fall eines einzelnen Comic-Objekts. Der DataContext des einzelnen Item Templates ist das Datenobjekt (also das einzelne Comic-Objekt) selbst. Somit können Sie im Template über Datenbindung Platzhalter für die eigentlichen Daten definieren (Listing 4).

<ListBox ItemsSource="{Binding}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Vertical">
                <TextBox Text="{Binding Path=Title}" />
                <Image Source="{Binding Path=ImageUrl}" />
            </StackPanel>
        </DataTemplate>,
    </ListBox.ItemTemplate>
    <ListBox.ItemsPanelTemplate>
        <ItemsPanelTemplate>
            <VirtualizingStackPanel Orientation="Horizontal" />
        </ItemsPanelTemplate>
    </ListBox.ItemsPanelTemplate>
</ListBox>

Für das Gesamtlayout der Items zueinander ist das Items Panel Template zuständig. Damit bestimmen Sie, ob die Elemente nebeneinander, untereinander oder sogar in alternativen Formen, z. B. im Kreis oder auf einer Timeline, ausgerichtet werden sollen. Hier bietet das Silverlight Control Toolkit für Windows Phone, das bereits in einer vergangenen Ausgabe intensiv vorgestellt wurde, eine nette Alternative – das WrapPanel Control, das die Elemente nebeneinander mit Zeilenumbruch darstellen kann (Abb. 5).

Fazit: Um das Aussehen von Controls anpassen zu können, gibt es Templates. Für das ListBox Control sind dies das Item Template und das Items Panel Template.

Um Daten in Silverlight darzustellen, gibt es das mächtige Konzept der Datenbindung. Das bedeutet, dass Sie nicht selbst einzelne Controls aktualisieren müssen, sondern dies automatisch passiert, sofern ein Control gebunden ist und sich die Quelldaten ändern. Abbildung 3 zeigt die beteiligten Komponenten.

Abb. 3: Datenbindung in Silverlight

Eine Eigenschaft des Binding Targets (z. B. Width eines Buttons) bindet auf eine Eigenschaft der Binding Source (z. B. Value eines Slider Controls). Sobald sich die Quelleigenschaft ändert, ändert sich auch die Zieleigenschaft mit. Während das Ziel einer Datenbindung meistens UI-Controls sind, kann die Quelle für deren Inhalte ein anderes UI-Control oder eine Datenklasse sein. Im Folgenden sehen Sie die Bindungsvariante „Control auf Control“. Dabei wird mittels ElementName-Wert der Name des Quell-Controls angegeben, Path bezieht sich auf dessen Eigenschaft.

<Button Content="{Binding Path=Text, ElementName=textBox1}" />
<TextBox  Name="textBox1" Text="TextBox" />

Listing 5 zeigt die Bindung auf eine Datenklasse, die im Code erstellt oder heruntergeladen wird. Statt des Elementnamen wird ein DataContext auf dem Ziel-Control oder einem hierarchisch darüberliegenden Control gesetzt. Die Path-Eigenschaft bezieht sich dann auf diesen DataContext. In unserem Beispiel wird er aus dem Code heraus am Grid Control gesetzt und vererbt sich damit hierarchisch auf alle Kinder, also TextBox und Image, weiter.

// In XAML:
<Grid x:Name="ContentPanel">
    <TextBox Text="{Binding Path=Title}" />
    <Image Source="{Binding Path=ImageUrl}" />
</Grid>
// In C#:
var comic1 = new Comic();
comic1.Title = "Lustiges Comic";
comic1.ImageUrl = new Uri("…");
this.ContentPanel.DataContext = comic1;

Wichtig für die Verwendung mit Datenbindung ist übrigens, dass die Datenquelle, hier die Comic-Klasse, ein spezielles Interface INotifyPropertyChanged implementiert. Sie enthält ein Event, das nach dem Setzen einer Eigenschaft gefeuert wird und der Binding Engine signalisiert, alle Bindungen zu aktualisieren. Eine Implementierung für die Comic-Klasse sehen Sie in Listing 6.

public class Comic : INotifyPropertyChanged
{
    private string TitleValue = default(string);
    public string Title
    {
        get { return TitleValue; }
        set { TitleValue = value; OnPropertyChanged("Title"); }
    }
    // Andere Eigenschaften ausgelassen..

    protected virtual void OnPropertyChanged(string propName)
    {
        if (this.PropertyChanged != null)
            this.PropertyChanged(this, new PropertyChangedEventArgs(propName));
    }
    public event PropertyChangedEventHandler PropertyChanged;
}

Je nach Bedarf kann während der Datenbindung noch ein Value Converter verwendet werden, der die Werte in beide Richtungen umwandelt (z. B. String <–> Datumswert). Mehr dazu finden Sie in der MSDN-Dokumentation.

Fazit: Datenbindung ist ein mächtiges Werkzeug für Silverlight am Windows Phone 7. Controls werden einmal auf eine Datenquelle gebunden und aktualisieren sich automatisch, wann immer sich die Quelle ändert.

Aufmacherbild: Leader. Concept. 3d illustration von Shutterstock / Urheberrecht: 3DConcept

[ header = Tipp 5 bis Tipp 8]

Was passiert, wenn Sie mehrere Controls innerhalb einer Seite mit Datenbindung an unterschiedliche Objekte binden wollen? Zum Beispiel haben Sie eine Seite mit zwei ListBoxen, eine bindet auf Postleitzahlen, die andere auf Orte. Hier schafft ein ViewModel Abhilfe. Dabei handelt es sich um eine Hilfsklasse, die ausschließlich das Ziel hat, Daten („Modelle“) in einer leicht bindbaren Form an das UI (die „View“) anzubinden. Die Controls der View binden also alle auf eine einzelne ViewModel-Klasse, die ihrerseits die Daten aus einzelnen Models „zusammenträgt“ (Abb. 4). Außerdem kann das ViewModel noch weitere Logik enthalten. Abbildung 5 zeigt das Beispiel mehrerer ViewModels für eine GPS-Applikation.

Abb. 4: Das Model-View-ViewModel-Entwurfsmuster

Abb. 5: Model-View-ViewModel im Einsatz

Das Page VM enthält drei Eigenschaften, die jeweils auf ein Control der View gebunden sind. Der Button ruft bei Click eine Methode auf dem ViewModel auf. Die ListBox stellt einzelne Kategorien dar, die ihrerseits wieder Zusatzinformationen haben, z. B. ob die Kategorie in der Liste ausgewählt ist. Deswegen besteht die CategoryList-Eigenschaft ihrerseits wieder aus ViewModels, die Daten enthalten.

Fazit: ViewModels sind ein Werkzeug, um Daten innerhalb einer Seite besser zu strukturieren und den Controls in gut bindbarer Form anzubieten. ViewModels sind ein architektureller Ansatz, der optional ist, jedoch nach Meinung des Autors einen großen Mehrwert für die Klarheit des Codes bietet. Allerdings handelt es sich dabei um ein fortgeschrittenes Thema. Wenn Sie mehr dazu wissen wollen, schauen Sie sich ein Video von Microsoft dazu an.

Ein integraler Bestandteil von Windows Phone 7 ist der „Zurück“-Hardwareknopf auf dem Gerät. Damit können Endbenutzer jederzeit einen Schritt zurückgehen – ähnlich einem Browser. Auch die Implementierung dieser Funktionalität erinnert manche Entwickler sicherlich an die Webwelt. Eine typische Windows-Phone-7-Anwendung besteht aus mehreren Seiten, zu denen man mit einem URL navigieren kann. Jede Seite besteht aus einer .XAML-Datei für das Layout und einer zugehörigen .CS-Datei für den Code.

Von einer Seite zur nächsten navigieren

Um die Seitennavigation zu verwenden, gibt es auf jeder Seite die Eigenschaften NavigationService und NavigationContext. Um die „Zurück“-Funktion kümmert sich das Betriebssystem von ganz alleine, die jeweils oberste Seite vom Navigations-Stack wird entfernt und die vorherige angezeigt.

Wann wird navigiert?

Durch das Überladen von vier Methoden können Sie Aktionen ausführen, bevor oder nachdem von oder zu einer Seite navigiert wird:

  • OnNavigatingTo
  • OnNavigatedTo
  • OnNavigatingFrom
  • OnNavigatedFrom

Im Folgenden wird beim Navigieren auf eine Seite der übergebene Query-String-Wert „Name“ ausgelesen und in einer TextBox dargestellt:

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    this.textBox1.Text = this.NavigationContext.QueryString["name"];
}

In OnNavigatingFrom können Sie übrigens durch Angabe von e.Cancel=true das Verlassen der Seite verhindern – wenn z. B. Daten noch nicht gespeichert wurden.

Zurück-Knopf abfangen

Wollen Sie auf den Zurück-Knopf in applikationseigene Weise reagieren? Das ist dann nötig, wenn Sie zum Beispiel eine Applikation geschrieben haben, die noch innerhalb einer Seite Zurück-Funktionalität braucht (Navigation durch ein Panorama zum Beispiel). Durch Überladung der OnBackKeyPress-Methode einer Seite können Sie die eingebaute Zurück-Funktion verhindern und selbst auf den Knopfdruck reagieren :

protected override void OnBackKeyPress(CancelEventArgs e)
{
    e.Cancel = true;
    // Eigener Code, der auf den Zurück-Knopf reagiert
}

Übrigens: Für fertige Seitenübergangsanimationen werfen Sie einen Blick in das Silverlight Control Toolkit.

Fazit: Eine Phone-7-Applikation ist gleichsam wie eine Webseite aus einzelnen Seiten aufgebaut. Das Betriebssystem kümmert sich um die Navigation zwischen diesen Seiten.

Sicherlich kennen Sie Listen wie in Abbildung 6, die durch die Verwendung des Pivot Controls nach unterschiedlichen Kriterien gefiltert oder sortiert werden können. Das prominenteste Beispiel ist wohl die Inbox von Outlook am Windows Phone. Wie können Sie solch eine Listendarstellung für Ihre eigenen Applikationen nutzen?

Abb. 6: Das Pivot Control in der Inbox von Windows Phone 7

Das Geheimnis steckt im Pivot Control. Es ist wie eine Art Karteireiter-Control, das durch die „Flick-Geste“, eine Fingerbewegung, zwischen den einzelnen Karteireitern umschaltet. Alles, was Sie also tun müssen, ist, in das Pivot Control drei ListBoxen zu platzieren, die ihre Daten jeweils aus unterschiedlich gefilterten oder sortierten Listen beziehen. In Listing 7 finden Sie die Definition des Pivots mit den darunterliegenden ListBoxen.

<controls:Pivot Title="comics">
    <controls:PivotItem Header="aktuellste">
        <ListBox ItemsSource="{NewestComics}" />
    </controls:PivotItem>
    <controls:PivotItem Header="beste">
        <ListBox ItemsSource="{BestComics}" />
    </controls:PivotItem>
    <controls:PivotItem Header="älteste">
        <ListBox ItemsSource="{OldestComics}" />
    </controls:PivotItem>
</controls:Pivot>

Fazit: Das Pivot Control ist ähnlich einem Karteireiter dafür geeignet, viele Inhalte auf kleinem Raum unterzubringen. Eine beliebte Variante ist es, mehrere ListBoxen, die unterschiedlich sortiert und gefiltert sind, auf jeweils einem Pivot Item unterzubringen.

Windows Phone 7 bietet Endbenutzern die Möglichkeit, unterschiedliche Farbschemen, so genannte „Themes“, einzurichten. Zur Auswahl stehen ein heller oder dunkler Hintergrund, sowie mehrere Akzentfarben. Diese Farbeinstellungen werden in den eingebauten Menüs und Applikationen des Betriebssystems verwendet. Auch die Controls Ihrer Applikation passen sich standardmäßig automatisch den Farben an. Abbildung 7 zeigt eine Beispielapplikation in zwei unterschiedlichen Farbvarianten.

Abb. 9: Eine Applikation im „Dark“ und „Light“ Theme

Eingebaute Themes verwenden

Bei automatischen Farbwerten beginnen die Probleme immer dann, wenn Sie manche Werte manuell setzen. Was, wenn Sie zum Beispiel einem TextBlock eine weiße Farbe gegeben haben und der Benutzer sich für das Light Theme entschieden hat? Aus diesem Grund gibt es eingebaute Brushes, die Sie verwenden sollten. Wann immer Sie die Standardfarbe für Vordergrund oder Hintergrund wollen, geben Sie einfach keine Farbe an. Die wichtigsten eingebauten Brushes und Styles sind in Tabelle 1 aufgelistet. Alle finden Sie in der MSDN-Dokumentation. Ein Beispiel für die Anwendung des PhoneAccentBrushes in Kombination mit normalem Text in einer einzelnen Zeile finden Sie hier:

<StackPanel Orientation="Horizontal">
     <TextBlock Text="Suchen Sie " Style="{PhoneTextSmallStyle}"/>
     <TextBlock Text="JETZT" Foreground="{StaticResource PhoneAccentBrush}" />
     <TextBlock Text="!" />
</StackPanel>

Eingebaute Themes überschreiben

Immer wieder kann es jedoch zu Situationen kommen, wo sich Ihre Controls NICHT automatisch an die eingebauten Themes anpassen sollen. Wenn Sie zum Beispiel ein dunkles Hintergrundbild verwenden, wird eine schwarze Textfarbe nur schwer lesbar sein. In diesem Fall sollten Sie die eingebauten, automatisch anpassenden Themes durch eigene, fixe Werte überschreiben. Bedenken Sie aber, dass Sie dadurch die persönliche Farbauswahl der Benutzerin ignorieren! Deshalb sollten Sie dieses Mittel so selten wie möglich einsetzen! Unter C:Program Files (x86)microsoft sdksWindows Phonev7.0Design finden Sie Vorlagen für alle eingebauten Theme-Kombinationen. Entscheiden Sie sich für ein Theme und fügen Sie die beiden .XAML-Dateien aus dem Unterverzeichnis Ihrem Projekt hinzu. Danach fügen Sie Listing 9 in die App.xaml-Datei ein und überschreiben somit die eingebauten Styles.

In App.xaml:
<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="ThemeResources.xaml" />
            <ResourceDictionary Source="System.Windows.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

Damit zumindest ein kleiner Teil der Farbauswahl der Benutzer erhalten bleibt, rät der Autor, den Farbwert PhoneAccentColor aus der ThemeResources.xaml-Datei im Projekt zu entfernen. Dadurch wird dieser Wert nicht überschrieben. Ein kleiner Tipp: Mit dem Werkzeug Expression Blend 4, das mit den Phone Tools installiert wird, können Sie Ihre Anwendung in den unterschiedlichen Themes ansehen, um mögliche Probleme der Farbkombinationen zu entdecken.

Fazit: Die Standard-Controls passen ihre Farben automatisch den Themes von Phone 7 an, die durch die Benutzer ausgewählt werden. Beim manuellen Überschreiben von Farbwerten muss man vorsichtig vorgehen, um keine unlesbaren oder eigenartigen Kombinationen zu bekommen.

[header = Tipp 9 bis Tipp 11]

Unter Windows Phone 7 ist parallel immer nur eine Anwendung aktiv. Ausnahme sind die betriebssystemeigenen Apps wie E-Mail oder Zune Player. Alle anderen Applikationen werden in einen „Schlafzustand“ versetzt, sobald die Benutzerin eine neue App startet. Dieser Vorgang wird als „Tombstoning“ bezeichnet. Dabei werden wichtige Informationen über den aktuellen State der Applikation abgespeichert (sozusagen als Nachruf am Grabstein, engl. Tombstone) und die eigentliche Applikation wird beendet. Holt der Benutzer die App zu einem späteren Zeitpunkt wieder in den Vordergrund, so wird eine NEUE Instanz gestartet, die die „Nachrufinformationen“, den State der alten App mitbekommt. Somit kann die neue Instanz zum letzten Zustand zurückkehren – für die Benutzer entsteht die Illusion, es sei die gleiche App im gleichen Zustand. Um den Tombstoning-Prozess zu implementieren, gibt es vier Methoden in der App.xaml.cs– Datei, die es ermöglichen, Code für den jeweiligen Anlass zu schreiben:

  • Launching: erster Start der App
  • Deactivating: App wird getombstoned
  • Activating: Neue Instanz mit bestehendem State
  • Closing: App wird beendet (nicht deaktiviert)

Wichtig ist, dass nicht jede App durch den Benutzer wieder reaktiviert wird; man kann sich also nicht darauf verlassen, dass Activating und Closing jemals aufgerufen werden. Um das Konzept zu verdeutlichen, hier noch vier Beispiele für mögliche Methodenabfolgen:

  • Launching, Deactivating
  • Launching, Closing
  • Launching, Deactivating, Activating, Closing
  • Launching, Deactivating, Activating, Deactivating, Activating, Closing

In Deactivating speichern Sie den State der Applikation in ein dafür vorgefertigtes State Dictionary und laden es in Activating wieder herein. Hier bietet sich das ViewModel aus Tipp 5 an, da darin alle Daten einer Seite gespeichert sind und somit nur ein einziges Objekt in das State Dictionary gespeichert werden muss. Listing 9 zeigt eine Beispielimplementierung für Tombstoning.

private void Application_Activated(object sender, ActivatedEventArgs e)
{
    var vm = (MainVM)PhoneApplicationService.Current.State["MainVM"];
    // ViewModel weiterverarbeiten
}

private void Application_Deactivated(object sender, DeactivatedEventArgs e)
{
    PhoneApplicationService.Current.State["MainVM"] = vm;
}


Fazit: Nur eine Windows-Phone-7-Applikation läuft zur gleichen Zeit. Tombstoning speichert den State einer Applikation ab, bevor sie deaktiviert bzw. beendet wird. Beim Reaktivieren steht dieser State wieder zur Verfügung, um den Benutzer dort weiterarbeiten zu lassen, wo er aufgehört hat.

Oftmals müssen Daten lokal abgespeichert werden. Sie kennen sicher auch zahlreiche Beispiele wie Caching, Speichern von Einstellungen und andere. Bei Windows Phone 7 gibt es Pro-Applikation-Dateisysteme – isolierte Bereiche, die jeweils einer Anwendung zur Verfügung stehen. Sie werden auch als „Isolated Storage“ bezeichnet.

Objekte in den Isolated Storage speichern

Wenn Sie lediglich Objekte im Isolated Storage abspeichern wollen, bietet die Klasse IsolatedStorageSettings eine gute Möglichkeit dafür. In Listing 10 sehen Sie ein Beispiel für die Verwendung.

var lastViewed = IsolatedStorageSettings.ApplicationSettings["last"] as Comic;
if (lastViewed != null)
{
    // letztes comic anzeigen
}
...
IsolatedStorageSettings.ApplicationSettings["last"] = currentComic;
IsolatedStorageSettings.ApplicationSettings.Save();

Das jeweilige Objekt wird dabei mittels DataContractSerializers in den Isolated Storage serialisiert. Sollten beim Speichern Fehler auftreten, so ist Ihre Klasse nicht serialisierbar – beachten Sie die Tipps aus der MSDN-Dokumentation, um das Problem zu beheben.

Mit Dateien im Isolated Storage arbeiten

Reichen Ihnen einzelne Objekte nicht? Wollen Sie lieber gesamte Dateien mit Unterverzeichnissen abspeichern? Auch dafür gibt es eine Möglichkeit im Isolated Storage. Das Tor zum Dateisystem ist die Klasse IsolatedStorageFile. Einmal geöffnet, können Sie ganz normale Verzeichnisse anlegen und über Streams auf Dateien in ihnen zugreifen! Somit steht der Weg für das Cachen ganzer Videos, Bilder etc. frei. Die Anlage einer neuen Datei und der Zugriff auf sie gestalten sich wie folgt:

var fs = IsolatedStorageFile.GetUserStoreForApplication();
fs.CreateDirectory("cache"); 
using (var stream = fs.CreateFile("cache/video1.wmv"))
{
    stream.Write(..);
}

Hilfreich sind dabei auch die Klassen aus dem Namespace System.IO, wie zum Beispiel der StreamReader und StreamWriter. Übrigens: Obwohl jede Applikation einen separaten Speicherbereich hat, erfolgt die Verteilung des Speicherplatzes nach einem First-Come-First-Serve-Prinzip. Eine Applikation kann also auch den kompletten Speicherplatz des Geräts belegen. Mit der AvailableFreeSpace-Eigenschaft auf dem IsolatedStorageFile kann der freie Speicherplatz abgefragt werden.

Deinstallation und Updates

Was passiert mit dem Speicherbereich der eigenen Anwendung im Fall von Deinstallation und Updates? Wenn sich die Benutzerin entscheidet, die App zu deinstallieren, wird auch der zugehörige Speicherbereich gelöscht. Anders sieht es bei einem Update aus. Aktualisieren Sie als Hersteller die Anwendung, so bleibt der Speicherbereich erhalten. Falls sich Ihr internes Dateiformat von einer Version zur anderen ändert, müssen Sie beim ersten Start der neuen Version nach bereits bestehenden Dateien im Isolated Storage suchen und sie konvertieren.

Fazit: Der Isolated Storage ist ein Dateisystem, das es jeder Applikation erlaubt, isoliert Daten abzulegen. Diese bleiben über die Laufzeit der Anwendung erhalten und gehen lediglich bei der Deinstallation verloren. Die Grenze für den Speicherplatz ist ausschließlich durch die Hardware des Phones limitiert.

Ein wichtiger Tipp zum Abschluss: Ihre Windows-Phone-7-Applikation sollte nicht mehr als 90 MB an Arbeitsspeicher brauchen. Tut sie das, so wird sie vom „Ressource Governor“ beendet, um sicherzustellen, dass die flüssige Bedienung gewährleistet bleibt. Behalten Sie das bereits während der Entwicklung im Hinterkopf und überprüfen Sie z. B. mittels eines überlagerten Controls, ob Sie Speicher z. B. durch große Bilder belegen, der nie wieder freigegeben wird.

Fazit: Laden Sie sich das Memory Usage Control aus den Links im Anhang herunter und überprüfen Sie laufend, ob Ihre App unter 90 MB Arbeitsspeicher verbraucht.

Bonus-Tipp: Marketplace

Um Ihre Applikation anderen zugänglich zu machen, müssen Sie sie im Windows Phone Marketplace publizieren. Ihre App kann dabei für die Benutzer entweder kostenlos oder kostenpflichtig sein. Pro Developer Account dürfen maximal 100 kostenlose Apps publiziert werden, was verhindern soll, das zu viele niedrigqualitative Apps den Marketplace überschwemmen. Für kostenpflichtige Apps gibt es keine Begrenzung. Bei der ersten Registrierung müssen Sie über eine externe Firma (Geo-Trust) Ihre Identität bestätigen. Um eine neue Applikation zu publizieren steigen Sie mit Ihrem Developer Account auf http://create.msdn.com ein. Damit Ihre App im Marketplace gefunden und beworben werden kann, müssen Sie einige Informationen angeben:

  • Sprache der Applikation
  • Kategorie
  • Beschreibung und Suchwörter
  • Icon in drei Größen
  • Ein bis acht Screenshots der Applikation
  • Optional: Preis im jeweiligen Land
  • Optional: Hintergrundgrafik für Marketplace-Werbung

Bei „Kategorie“ gilt es zu beachten, dass für Publikationen, die als „Spiel“ klassifiziert sind, spezielle Regeln gelten. Außerdem scheinen Spiele nicht direkt im Startmenü auf, sondern werden über den Spiele-Hub gestartet.

Was passiert nach der Publikation? Ihre App wird manuell und automatisch auf die Richtlinien für Windows-Phone-7-Applikationen [11] überprüft. Dieses Dokument definiert klar, welche Inhalte erlaubt sind und wie sie technisch implementiert werden müssen. Die Überprüfung dauert ca. eine Woche – schlägt sie fehl, bekommen Sie Rückmeldung über die Probleme. Andernfalls wird Ihre Applikation publiziert und Sie können sich bereits auf folgende Einkünfte freuen.

Fazit: Die Publikation einer App erfolgt über die App-Hub-Seite. Die Überprüfung erfolgt nach einem Richtliniendokument, teils automatisch, teils manuell. Einkünfte werden über die angegebene Kreditkarte ausbezahlt.

Laden Sie sich die Developer Tools herunter und beginnen Sie mit der Entwicklung Ihrer ersten Applikation! Die Tipps aus diesem Artikel sollten es Ihnen erleichtern!

Ressource

Beschreibung

PhoneAccentBrush

Vordergrundfarbe mit Hervorhebung

PhoneForegroundBrush

Standard-Vordergrund- und

Rahmenfarbe

PhoneBackgroundBrush

Standard-Hintergrundfarbe

PhoneContrastBackgroundBrush

Invertierter Hintergrund für Kontrast

PhoneContrastForegroundBrush

Invertierter Vordergrund für Kontrast

PhoneDisabledBrush

Deaktiverter Vordergrund

PhoneTextNormalStyle

Styles für TextBlock Control

PhoneTextTitle[1-3]Style

PhoneTextLargeStyle

PhoneTextExtraLargeStyle

PhoneTextSmallStyle

PhoneTextContrastStyle

PhoneTextAccentStyle

Tabelle 1: Theme Brushes und Styles

Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -