Gibt es eine typsichere Möglichkeit, zwischen Fenstern in Windows Phone zu navigieren?

8

Ich suche nach einer Möglichkeit, zwischen den Bildschirmen in meiner App zu navigieren. Was ich bisher gesehen habe, besteht im Wesentlichen darin, einen String-URI an den NavigationService zu übergeben, der mit Abfrage-String-Parametern vervollständigt wird, z.B.

%Vor%

Ich bin nicht wirklich scharf darauf, aber letztendlich, weil es magische Saiten benötigt und sie können zu Problemen auf der Straße führen.

Idealerweise würde ich einfach eine Instanz der Klasse erstellen, zu der ich navigieren möchte, und die Parameter als Argumente an den Konstruktor übergeben. Ist das möglich? Wenn ja, wie?

    
DaveDev 15.11.2013, 15:05
quelle

5 Antworten

7

Während die tatsächliche Navigation eventuell Zeichenfolgen verwenden muss, können Sie einen Wrapper erstellen oder verwenden, der typsicher ist.

Ich würde vorschlagen, Caliburn Micro zu betrachten, selbst wenn Sie es nur für die typsichere Navigation verwendet haben. Hier ist ein Ausschnitt aus einem Tutorial zur Verwendung in WP8 :

  

Der NavigationService, der mit dem Toolkit geliefert wird, unterstützt ein Modell anzeigen zuerst -Ansatz: Anstatt zu deklarieren, welches die URL der Seite ist, auf die wir den Benutzer aufnehmen möchten (das ist der Standardansatz) Erklären Sie, welches ViewModel angezeigt werden soll. Der Dienst kümmert sich um die Erstellung der korrekten URL und zeigt die Ansicht an, die dem Ansichtsmodell zugeordnet ist .

Alternativ können Sie sich auch das Windows Phone MVC ansehen, das auch eine sichere Navigation für bestimmte Typen bietet. Vielleicht können Sie den Navigationscode sogar selbst herausholen, da er unter MS-PL lizenziert ist.

    
Austin Thompson 19.11.2013, 16:33
quelle
3

Grundsätzlich, nein, das ist nicht eingebaut. Komplexe Parameter wie IRepository-Instanzen sind leider nicht in der Lage, die Navigationsmöglichkeiten in Silverlight zu nutzen; Ich benutze normalerweise irgendeine Form von IoC-Container, um diese zu handhaben. Einfachere POCO-Parameter können leicht zu einer Zeichenkette serialisiert werden, aber das erfordert immer noch magische Zeichenketten und manuelle Abfrage-String-Analyse.

Sie können jedoch leicht selbst etwas Typesafe bauen. Zum Beispiel, hier ist mein Ansatz.

Für Parameterdaten habe ich eine Klasse namens 'Extras', die Dictionary<string, object> mit Methoden wie GetBool(string) , GetInt32(string) usw. umschließt und eine statische Factory-Methode CreateFromUri(Uri) ; das ist gut genug für meine Zwecke.

Ich verwende das in Verbindung mit typsicherer Navigation. Ich mag das MVVM-Muster sehr, und jede meiner Seiten hat ein ViewModel, das fast die gesamte Logik einkapselt. Die Eins-zu-eins-Beziehung der Seite zu ViewModel macht letztere zu einem idealen Navigationsschlüssel. Das, kombiniert mit Attributen und Überlegungen, gibt uns eine einfache Lösung:

%Vor%

Legen Sie eines davon auf jeder Ihrer Seiten mit dem richtigen ViewModel-Typ fest.

%Vor%

In einer Singleton NavigationManager-ähnlichen Klasse können Sie Folgendes tun:

%Vor%

Und genau so haben Sie eine Sammlung aller navigierbaren Typen in Ihrer App. Von dort ist es nicht viel mehr Arbeit, sie zum Beispiel in ein Wörterbuch zu schreiben. Wenn Sie einer Konvention folgen, wo Sie Ihre Seiten ablegen, können Sie zB zwischen Typ und Uri ganz einfach übersetzen ... zum Beispiel new Uri("/Pages/" + myPageType.Name + ".xaml", UriKind.Relative) . Es ist nicht viel mehr, Unterstützung für Abfrageparameter hinzuzufügen. Schließlich erhalten Sie eine Methode wie folgt:

%Vor%

Schließlich, in der Methode OnNavigatedTo der Seite, mache ich etwas wie:

%Vor%

Dies gibt schließlich den Anschein einer stark typisierten Navigation. Dies ist ein nackter Ansatz. Von meinem Kopf her könnte dies verbessert werden, indem die erforderlichen Parameter im Navigationsattribut hinzugefügt und zur Navigationszeit validiert werden. Es unterstützt auch keine komplexeren Navigationsarten, bei denen der Wert von nav-Argumenten das endgültige Ziel bestimmen würde. Trotzdem passt das zu meinem 90% igen Anwendungsfall - vielleicht wird es auch für dich funktionieren.

Es gibt definitiv einige Details, die hier weggelassen wurden, wie zum Beispiel, um eine Instanz von NavigationService zu erhalten - Ich kann heute Abend ein vollständigeres Sample erstellen, aber das sollte genug sein, um loszulegen.

    
Ben 19.11.2013 00:43
quelle
2

Sie können PhoneApplicationService.State

verwenden

Es ist ein Dictionary<String,Object>

PhoneApplicationService.State wird häufig in Tombstoning verwendet, um den aktuellen Status der Anwendung zu speichern. Es kann jedoch verwendet werden, um Daten bequem zwischen Seiten zu übergeben.

MSDN Dokumentation

  

Windows Phone-Anwendungen sind deaktiviert, wenn der Benutzer navigiert   eine andere Anwendung. Wenn der Benutzer zu der Anwendung zurückkehrt, indem   mit der Schaltfläche Zurück oder durch Ausführen eines Startprogramms oder einer Auswahlaufgabe   Anwendung wird reaktiviert. Eine Anwendung kann Transienten speichern   Anwendungszustand im State Dictionary im Handler für die   Deaktiviertes Ereignis Im Activated-Event-Handler kann eine Anwendung dies tun   Verwenden Sie die im Zustandswörterbuch gespeicherten Werte für die transiente Anwendung   Staat.

Was Sie tun würden, ist

%Vor%

Dann können Sie sie auch in Ihrer navigierten Methode abrufen

%Vor%

Hier finden Sie einen tieferen Einblick in die Verwendung dieser Funktion

    
Anthony Russell 18.11.2013 21:46
quelle
1

WPF unterstützt das Navigieren zu einem bereits erstellten Objekt, aber WP8 fehlt die Navigate overload.

Wenn Sie keine XAML-Seiten-URIs fest codieren möchten, können Sie die folgende (etwas schmutzige) Hilfsfunktion verwenden, um den .xaml-Ressourcen-URI einer Klasse abzurufen.

%Vor%

Dann können Sie diese URL ändern und zu ihr navigieren:

%Vor%     
Ark-kun 19.11.2013 05:09
quelle
1

Unsere Lösung, die gut funktioniert:
1. Verwenden Sie keine Suchzeichenfolgen in Page Uris, dies ist nur komplett gegen MVVM wo Ansicht nur Zeug anzeigen sollte, aber die tatsächliche Logik zum Laden und Auswählen von Elementen ist in ViewModel.
2. Erstellen Sie class mit konstanten Seitennamen und wann immer Sie navigieren möchten, verwenden Sie einfach folgendes:

%Vor%     
Martin Suchan 21.11.2013 12:56
quelle