Как открыть вторичное окно с оболочкой?

Я попытался адаптировать инструкции по реализации оболочки в Template10 на GitHub. в оболочку во вторичном окне, но это не работает.

Этот код:

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));
    });

получает это исключение:

E VUI 1808 16:12:27.203 D:\SVN_Trunk\Source\Uwp\Gui\UwpMain\ViewModels\MyPrimaryShellViewModel.cs.275.MyFunction System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта. в Uwp.Main.UwpMain_XamlTypeInfo.XamlUserType.ActivateInstance() в Windows.UI.Xaml.Controls.Frame.Navigate (тип sourcePageType, параметр объекта, NavigationTransitionInfo infoOverride) в Template10.Services.NavigationService.FrameFacade.Navigate (страница типа, параметр объекта , NavigationTransitionInfo infoOverride) в Template10.Services.NavigationService.NavigationService.d__34.MoveNext() --- Конец трассировки стека из предыдущего места, где было выдано исключение --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(задача задачи) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(задача задачи) в Template10.Services.NavigationService.NavigationService.Navigate(страница типа, параметр объекта, NavigationTransitionInfo infoOverride) в Template10.Services.ViewService.ViewService.‹>c__DisplayClass1_0.‹b__0>d .MoveNext() --- Конец трассировки стека из предыдущего места, где было выдано исключение --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(задача задачи) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(задача задачи) в Template10.Services.ViewService.ViewService.d__1.MoveNext() --- Конец трассировки стека из предыдущее местоположение, где было выдано исключение --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(задача) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(задача задачи) в System.Runtime.CompilerServices.TaskAwaiter`1.GetResult( ) в Uwp.Main.ViewModels.MyPrimaryShellViewModel.‹>c__DisplayClass63_0.‹b__0>d.MoveNext()

MySecondaryShell построен следующим образом:

public static HamburgerMenu HamburgerMenu => Instance.EmulatorHamburgerMenu;

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

Когда я открываю главное окно с его оболочкой, я создаю объект оболочки, а затем назначаю ему NavigationService.

Но когда я открываю дополнительное окно, я просто вызываю NavigationService.OpenAsync с типом (MySecondaryShell) в качестве параметра. Проблема в том, что NavigationService неправильно настроен в оболочке? (Из чтения кода Template10 в мой последний вопрос, я не увидел, где установлен NavigationService).

Как мне открыть оболочку в качестве вторичного окна?


person user1725145    schedule 08.12.2017    source источник
comment
У вас есть обновления?   -  person Nico Zhu - MSFT    schedule 12.12.2017
comment
@NicoZhu-MSFT привет, извините, да - спасибо за этот отличный ответ!   -  person user1725145    schedule 12.12.2017


Ответы (1)


Как мне открыть оболочку в качестве вторичного окна?

Проблема в том, что вы не передали navigationService в MySecondaryShell. И тогда MySecondaryShell не сможет инициализироваться без navigationService. Вы можете сделать свою оболочку следующим образом.

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;
    }
}

Использование

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));
    });

});
person Nico Zhu - MSFT    schedule 11.12.2017