2017-12-08 3 views
1

Ich habe versucht, die Anweisungen zum Implementieren einer Shell in Template10 on GitHub an eine Shell in einem sekundären Fenster anzupassen, aber es funktioniert nicht.Wie öffne ich ein sekundäres Fenster mit einer Shell?

Dieser Code:

await DispatcherWrapper.Current().DispatchAsync(async() => 
     { 
       //The next line gets the exception 
       var control = await BootStrapper.Current.NavigationService.OpenAsync(
                typeof(MySecondaryShell), null, "My Secondary Function"); 
       control.Released += Control_Released; 
       BootStrapper.Current.NavigationService.Navigate(typeof(MySecondaryPage)); 
    }); 

wird diese Ausnahme:

E VUI 1808 16: 12: 27,203 D: \ SVN_Trunk \ Source \ Uwp \ Gui \ UwpMain \ Viewmodels \ MyPrimaryShellViewModel.cs .275.MyFunction System.NullReferenceException: Objektreferenz nicht auf eine Instanz eines Objekts festgelegt. bei Uwp.Main.UwpMain_XamlTypeInfo.XamlUserType.ActivateInstance() bei Windows.UI.Xaml.Controls.Frame.Navigate (Typ sourcePageType, Objekt Parameter, NavigationTransitionInfo infoOverride) bei Template10.Services.NavigationService.FrameFacade.Navigate (Typ Seite , Objektparameter, NavigationTransitionInfo infoOverride) bei Template10.Services.NavigationService.NavigationService.d__34.MoveNext() --- Ende des Stack-Trace von früheren Speicherort, wo Ausnahme ausgelöst wurde --- bei System.Runtime.CompilerServices.TaskAwaiter. ThrowForNonSuccess (Aufgabenaufgabe) bei System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Aufgabenaufgabe) bei Template10.Services.NavigationService.NavigationService.Navigate (Typ Seite, Objektparameter ter, NavigationTransitionInfo infoOverride) bei Template10.Services.ViewService.ViewService. <> c__DisplayClass1_0. < b__0> d.MoveNext() --- Ende des Stack-Trace aus früheren Stelle, wo Ausnahme ausgelöst wurde --- bei System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Task-Task) bei System.Runtime.CompilerServices.TaskAwaiter .HandleNonSuccessAndDebuggerNotification (Task-Task) bei Template10.Services.ViewService.ViewService.d__1.MoveNext() --- Ende des Stack-Trace aus früheren Stelle, wo Ausnahme ausgelöst wurde --- bei System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Task-Task) bei System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Task-Task) bei System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() bei Uwp.Main.ViewModels.MyPrimar yShellViewModel. <> c__DisplayClass63_0. < b__0> d.MoveNext()

MySecondaryShell wie folgt aufgebaut sind:

public static HamburgerMenu HamburgerMenu => Instance.EmulatorHamburgerMenu; 

    public MySecondaryShell(INavigationService navigationService) 
    { 
     this.InitializeComponent(); 
     HamburgerMenu.NavigationService = navigationService; 
    } 

Wenn ich die Primärfenster mit seiner Schale öffnen, erstelle ich das Objekt Schal und dann die Navigation zuweisen.

Aber wenn ich ein sekundäres Fenster öffne, rufe ich NavigationService.OpenAsync mit dem Typeof (MySecondaryShell) als Parameter auf. Ist das Problem, dass der NavigationService in der Shell nicht korrekt eingestellt ist? (Beim Lesen des Template10-Codes in my last question konnte ich nicht sehen, wo der NavigationService eingestellt ist).

Wie soll ich eine Shell als sekundäres Fenster öffnen?

+0

Haben Sie keine Updates haben? –

+0

@ NicoZhu-MSFT hi, sorry ja - danke für diese tolle Antwort! –

Antwort

1

Wie sollte ich eine Shell als sekundäres Fenster öffnen?

Das Problem ist, Sie haben nicht Navigation zu MySecondaryShell weitergegeben. Und dann wird MySecondaryShell Initialisierung ohne NavigationService fehlschlagen. Du könntest deine Shell wie folgt aussehen lassen.

public sealed partial class MyShell : Page 
{ 
    public static MyShell Instance { get; set; } 

    public static HamburgerMenu HamburgerMenu => Instance.MyHamburgerMenu; 

    Services.SettingsServices.SettingsService _settings; 
    public MyShell() 
    { 
     Instance = this; 
     this.InitializeComponent(); 
     _settings = Services.SettingsServices.SettingsService.Instance; 
     var service = BootStrapper.Current.NavigationServiceFactory(BootStrapper.BackButton.Attach, BootStrapper.ExistingContent.Exclude);   
     SetNavigationService(service); 

    } 
    public void SetNavigationService(INavigationService navigationService) 
    { 
     MyHamburgerMenu.NavigationService = navigationService; 
     HamburgerMenu.RefreshStyles(_settings.AppTheme, true); 
     HamburgerMenu.IsFullScreen = _settings.IsFullScreen; 
     HamburgerMenu.HamburgerButtonVisibility = _settings.ShowHamburgerButton ? Visibility.Visible : Visibility.Collapsed; 
    } 
} 

Nutzungs

await DispatcherWrapper.Current().DispatchAsync(async() => 
{ 
    var control = await BootStrapper.Current.NavigationService.OpenAsync(typeof(Views.MyShell), null, Guid.NewGuid().ToString()); 
    await control.CoreDispatcher.RunAsync(CoreDispatcherPriority.Normal,() => 
    { 
     Views.MyShell.HamburgerMenu.NavigationService.Navigate(typeof(Views.TestPage)); 
    }); 

}); 
Verwandte Themen