2016-10-18 3 views
0

Ich habe ein MVVM Light UWP-Projekt, wo ich die App zurücksetzen und die Benutzeroberfläche neu laden möchte. Ich hatte gehofft, dass ich einfach in meine App-Klasse einsteigen könnte, um das zu tun, aber ich mache seltsame Dinge.UWP zurücksetzen Hauptrahmen

Als Test, wenn ich

Window.Current.Content = null; 

Form innerhalb einer Seite in meiner app nennen, dann wird der Inhalt des Fensters wird leer, wie erwartet. Aber wenn ich meinen Setup-Code erneut ausführe, der die AppShell (meine Root-Container-Seite) einrichtet und Window.Current.Content auf diesen setzt, ändert sich nichts.

Der ViewModel-Konstruktor wird nicht erneut getroffen, daher vermute ich, dass das Problem damit zu tun hat, wie MVVM Light das ViewModel instanziiert. Vielleicht muss ich noch etwas anderes tun, um eine neue Instanz davon zu bekommen?

Antwort

0

Ich denke Problem ist, dass Sie Window.Current.Content = null;, von MVVM Licht gesetzt haben die Window.Current.Content ist die Frame und in der Regel nennen wir dies als rootFrame, wie Sie es aus dem App.xaml.cs Code sehen:

Frame rootFrame = Window.Current.Content as Frame; 

Einmal Sie können es als null gesetzt, dann die Frame, die für die Ausrichtung der Seiten verwendet wird, verschwunden ist, müssen Sie zunächst eine neue Instanz eines gerechten Frame schaffen, wie es in App.xaml.cs tut:

if (rootFrame == null) 
{ 
    // Create a Frame to act as the navigation context and navigate to the first page 
    rootFrame = new Frame(); 

    rootFrame.NavigationFailed += OnNavigationFailed; 

    if (e.PreviousExecutionState == ApplicationExecutionState.Terminated) 
    { 
     //TODO: Load state from previously suspended application 
    } 

    // Place the frame in the current Window 
    Window.Current.Content = rootFrame; 
} 

if (rootFrame.Content == null) 
{ 
    // When the navigation stack isn't restored navigate to the first page, 
    // configuring the new page by passing required information as a navigation 
    // parameter 
    rootFrame.Navigate(typeof(MainPage), e.Arguments); 
} 

Da Sie keinen Code Ihres "Setup-Codes, der die AppShell erstellt" veröffentlicht haben, schreibe ich hier eine Antwort, rate einfach das mögliche Problem mit deinem Code, und hier ist meine Demo zum Zurücksetzen der Seite:

Window.Current.Content = null; 
var rootFrame = new Frame(); 
Window.Current.Content = rootFrame; 
await Task.Delay(1000); 
_navigationService.NavigateTo(ViewModelLocator.SecondPageKey, "lala"); 

Wenn es noch ein Problem gibt, bitte hinterlassen Sie einen Kommentar oder vielleicht teilen Sie uns mehr Code.

+0

Danke. Ich habe den Fensterinhalt nur als Test auf Null gesetzt, wie ich in meiner Frage gesagt habe ... nur um zu beweisen, dass es tatsächlich gelöscht wurde. Ich verstehe, dass es auf einen Rahmen eingestellt werden muss. Dein Code ist hilfreich, aber kannst du etwas über den _navigationService erzählen? – Scott

+0

Es ist der 'private readonly INavigationService _navigationService;', wenn Sie die Vorlage MVVM Light verwenden, um eine UWP-App zu erstellen, finden Sie diese in 'MainViewModel.cs'. Die Instanz von diesem wird tatsächlich in dem 'ViewModelLocator.cs' erstellt. –