2016-03-29 10 views
0

Nun, ich baue gerade eine WinRT-App und ich stehe vor diesem Problem.Wie wird SourcePageType als Seite umgewandelt?

Was ich versuche zu erreichen, ist, dass ich die Eigenschaften auf der vorherigen Seite, von der ich navigiert bin, lesen oder ändern muss.

Also lassen Sie uns sagen, dass ich zwei Seiten habe: MainPage und WatchPage.

Ich Navigation zu WatchPage von MainPage und im Inneren des WatchPage'sOnNavigatedTo Ereignis muss ich innerhalb MainPage eine Eigenschaft zuzugreifen, ohne Navigationsparameter mit ...

Wie kann ich das erreichen?

protected override void OnNavigatedTo(NavigationEventArgs e){ 
    Type LastPage = rootFrame.BackStack.Last().SourcePageType; 

    if(LastPage == typeof(MainPage){ 
     // here, for example, say that MainPage has a property called isLoadSuccess 
     // I need to set that property to false 
     // or call a method from MainPage 
     // => this is not working MainPage MP = LastPage as MainPage; 
     // I know that it should not work anyway, but, how can I achieve this? 
    } 
} 
+0

Sie können dies in OnNavigatedFrom Ereignis der Hauptseite tun. – Archana

+0

@Archana Ja ich weiß aber was, wenn ich einige Methoden von MainPage aufrufen möchte? –

+0

Sie können dieses Ereignis richtig aufrufen. Irgendein Problem? – Archana

Antwort

1

Was Sie zu tun versuchen, nicht den bestehenden Rahmen erreicht werden. Das heißt, ein Verweis auf die Instanz Ihrer vorherigen Seite existiert nicht im BackStack. Das einzige, was existiert, ist ehrlich gesagt das Rezept, um die Instanz neu zu erstellen. Das heißt, der BackStack enthält den Typ und den Parameter. Mit diesen beiden Elementen sollten Sie in der Lage sein, die Klasse erneut zu instanziieren, wenn der Benutzer im Rahmen zu ihm zurück navigiert. Diese Bestandteile enthalten übrigens den Typ und den serialisierbaren Parameter - nur mit einem serialisierbaren Parameter kann die Anwendung den BackStack in NavigationState speichern und zuverlässig wiederherstellen, sollte Ihre Anwendung ausgesetzt/beendet werden.

Das ist die Geschichte, jetzt zu Ihrem Problem. Ich sehe mehrere mögliche Lösungen, um ehrlich zu sein, und ich denke, dass einige von ihnen akzeptabel sind.

Der erste Vorbehalt ist, dass Sie NavigationCacheMode = Enabled verwenden müssen. Ohne dies wird Ihre Seite (einschließlich der vorherigen Seite) mit jeder Navigation, einschließlich Zurück, neu erstellt. Dies ist ein wichtiges Verhalten von UWP, da davon ausgegangen wird, dass Ihre Seite aus dem Speicher entfernt wurde, um den gesamten Footprint zu speichern. Die Einstellung von NavigationCacheMode überschreibt dies.

  1. einen statischen Verweis erstellen

Dieses einfach genug ist richtig? Etwas wie folgt aus:

public readonly static MainPage Instance; 
public MainPage() { 
    Instance = this; 
} 

dieser Vorsicht, weil es Ihre Ansichten erfordert einen Verweis auf einander haben. Das ist ein ziemlich minimales Risiko, IMHO.

  1. Geben Sie eine Referenz

Dies ist am einfachsten mit Navigate (Parameter), wie dies zu erreichen.

// MainPage 
public void GoAway() { 
    this.Frame.Navigate(typeof(SecondPage), this); 
} 

// SecondPage 
MainPage MainPage; 
public void OnNavigatedTo(object parameter) { 
    MainPage = parameter as MainPage; 
} 

dieser Vorsicht, weil es erfordert, dass Sie etwas zu übergeben, die nicht serialisiert werden kann. Manchmal ist dies jedoch akzeptabel.

Irgendwelche davon sinnvoll?

Viel Glück.

+0

Danke für diese schöne Antwort. Ich habe eine statische Klasse mit dem Namen 'NavigationParameters' erstellt und die Eigenschaften auf die Referenzen und Instanzen festgelegt, die ich auf einer anderen Seite verwenden möchte, anstatt die ganze Seite festzulegen. Ich hoffe es wird in Zukunft keine Probleme geben. –

0

Ich würde empfehlen, eine statische Klasse mit statischen Eigenschaften und Methoden zu erstellen .. Ich glaube nicht, was Sie gut zu erreichen versuchen Praxis ist .. statt, hier ist mein Beispiel:

public static class Shared 
    { 
     public static string property = "something.."; 

     public static async Task<bool> Method() 
     { 
      await Task.Delay(400); 
      return false; 
     } 
    } 

Dann können Sie die Methode aufrufen, erhalten oder die Eigenschaft von jedem, wo festgelegt:

bool result = await Shared.Method(); 
Verwandte Themen