Frage

Ich suche nach einer Möglichkeit, zwischen Bildschirmen in meiner App zu navigieren.Grundsätzlich besteht das, was ich bisher gesehen habe, darin, einen String-URI mit Abfragezeichenfolgenparametern an den NavigationService zu übergeben., beispielsweise.

NavigationService.Navigate(new Uri("/MainPage.xaml?selectedItem=" +bookName.Id, UriKind.Relative));

Ich bin aber letztendlich nicht wirklich daran interessiert, weil es magische Saiten erfordert und sie später zu Problemen führen können.

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?

War es hilfreich?

Lösung

Während die eigentliche Navigation Saiten schließlich verwenden muss, können Sie einen Wrapper erstellen oder verwenden, der type sicher ist.

Ich würde vorschlagen, auf caliburn micro zu betrachten, auch wenn Sie es nur für die type sichere Navigation verwendet haben. Hier ist ein Snippet Von einem Tutorial zur Verwendung in WP8 :

Der mit dem Toolkit gelieferte NavigationService unterstützt den ersten Ansatz: Anstelle der Deklaration, in der die URL der Seite ist, in der wir den Benutzer annehmen möchten (dh der Standardansatz), sind wir Deklarieren Sie, welche ViewModel sind, die wir anzeigen möchten. Der Dienst kümmert sich darum, die richtige URL zu erstellen und die Ansicht anzuzeigen, die dem Ansichtsmodell zugeordnet ist.

Alternativ können Sie sich auf Windows Phone MVC ansehen, das auch eine gewisse sichere Navigation hat. Möglicherweise können Sie sogar nur den Navigationscode herausziehen, der selbst alleine verwendet wird, da er unter MS-PL .

Andere Tipps

Grundsätzlich, nein, nicht das ist eingebaut.Komplexe Parameter wie IRepository-Instanzen liegen leider außerhalb der Möglichkeiten der Navigationsfunktionen in Silverlight;Normalerweise verwende ich eine Form von IoC-Container, um diese zu handhaben.Einfachere POCO-Parameter lassen sich leicht in eine Zeichenfolge serialisieren, dies erfordert jedoch weiterhin magische Zeichenfolgen und manuelles Parsen von Abfragezeichenfolgen.

Sie können jedoch leicht selbst etwas Typsicheres bauen.Hier ist zum Beispiel mein Ansatz.

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

Ich benutze dies in Verbindung mit typsicherer Navigation.Ich mag das MVVM-Muster sehr und jede meiner Seiten hat ein Ansichtsmodell, das fast die gesamte Logik kapselt.Die Eins-zu-Eins-Beziehung von Seite zu ViewModel macht letzteres zu einer idealen Navigationstaste.Das, kombiniert mit Attributen und Reflexion, gibt uns eine einfache Lösung:

public class NavigationTargetAttribute : Attribute
{
    private readonly Type target;

    public ViewModelBase Target
    {
        get { return target; }
    }

    public NavigationTargetAttribute(Type target)
    {
        this.target = target;
    }
}

Platzieren Sie eine davon auf jeder Ihrer Seiten mit dem richtigen ViewModel-Typ.

[NavigationTarget(typeof(LoginViewModel))]
public class LoginPage : PhoneApplicationPage
{ ... }

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

GetType().Assembly
    .GetTypes()
    .Select(t => new { Type = t, Attr = t.GetCustomAttributes(false).FirstOrDefault(attr => attr is NavigationTargetAttribute) })
    .Where(t => t.Attr != null);

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

public void Navigate(Type target, Extras extras)
{
    Type pageType;
    if (navigationTargets.TryGetValue(target, out pageType))
    {
        var uri = CreateUri(pageType, extras);
        navigationService.NavigateTo(uri);
    }

    // error handling here
}

Schließlich auf der Seite OnNavigatedTo methode, ich mache so etwas wie:

var extras = Extras.CreateFromUri(e.Uri);
((ViewModelBase) DataContext).OnNavigatedTo(extras);

Dies gibt schließlich den Anschein einer stark typisierten Navigation.Dies ist ein einfacher Ansatz;von Anfang an könnte dies verbessert werden, indem dem Navigationsattribut die erforderlichen Parameter hinzugefügt und zur Navigationszeit validiert werden.Es unterstützt auch keine komplexeren Navigationstypen, bei denen der Wert der Navigationsargumente das endgültige Ziel bestimmen würde.Trotzdem passt dies zu meinem 90% igen Anwendungsfall - vielleicht funktioniert es auch für Sie.

Hier werden definitiv einige Details weggelassen, z. B. wie genau man eine Instanz von erhält NavigationService - Ich kann später heute Abend eine vollständigere Probe erstellen, aber das sollte ausreichen, um loszulegen.

Sie können verwenden PhoneApplicationService.State

Es ist ein Dictionary<String,Object>

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

MSDN-Dokumentation

Windows Phone-Anwendungen werden deaktiviert, wenn der Benutzer zu navigiert eine andere Anwendung.Wenn der Benutzer zur Anwendung zurückkehrt, durch mit der Zurück-Taste oder durch Ausführen einer Start- oder Auswahlaufgabe wird die anwendung wird reaktiviert.Eine Anwendung kann transiente speichern anwendungsstatus im Statuswörterbuch im Handler für die Deaktiviertes Ereignis.Im aktivierten Ereignishandler kann eine Anwendung verwenden Sie die im Statuswörterbuch gespeicherten Werte für die vorübergehende Anwendung Staat.

Grundsätzlich würden Sie Folgendes tun

PhoneApplicationService.State.add(selectedName,yourobjectInstance);
NavigationService.Navigate((new Uri("/MainPage.xaml?selectedItem="+selectedName,UriKind.Relative));

Dann können Sie es in Ihrer navigierten too-Methode abrufen

YourObject yourObjectInstance;
var yourObj = PhoneApplicationService.State["yourObjectName"];
yourObjectInstance = yourObj is YourObject ? (yourObj as YourObject) : null;

Hier finden Sie einen ausführlicheren Einblick in die Verwendung dieser Funktion

WPF unterstützt das Navigieren auf ein bereits erstelltes Objekt, aber WP8 fehlt der allgemeine Überlast der Navigate.

Wenn Sie keine Festplatten-Xaml-Seite Uris nicht möchten, können Sie die folgende (eine Bit-Dirty) -Helper-Funktion verwenden, um die .XAML-Ressourcen-URI einiger Klasse zu erhalten.

generasacodicetagpre.

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

generasacodicetagpre.

unsere Lösung, die gut funktioniert:
1. Verwenden Sie keine Abfragezeichenfolgen in der Seite URIS, dies ist einfach wieder vollständig, in der MVVM nur Sachen anzeigen soll, aber die eigentliche Logik zum Laden und Auswahl von Elementen ist in ViewModel.
2. Erstellen Sie Klasse mit Const-Seitennamen und wann immer Sie navigieren möchten, verwenden Sie einfach diese:

generasacodicetagpre.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top