2017-12-08 22 views
1

Template10 on GitHubのシェルをインプリメントするための手順をセカンダリウィンドウのシェルに適用しようとしましたが、動作していません。シェルでセカンダリウィンドウを開くにはどうすればいいですか?

このコード:

EのVUI 1808 16:12:27.203 D:\ SVN_Trunk \ソース\ UWP \桂\ UwpMain \のviewmodels \ MyPrimaryShellViewModel.cs

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

は、この例外を取得します.275.MyFunction System.NullReferenceException:オブジェクト参照がオブジェクトのインスタンスに設定されていません。 Template10.Services.NavigationService.FrameFacade.NavigateでWindows.UI.Xaml.Controls.Frame.Navigate(タイプsourcePageType、オブジェクトパラメータ、NavigationTransitionInfo infoOverride)でUwp.Main.UwpMain_XamlTypeInfo.XamlUserType.ActivateInstanceで () (タイプページ、オブジェクトパラメータ、NavigationTransitionInfo infoOverride)at Template10.Services.NavigationService.NavigationService.d__34.MoveNext() ---例外がスローされた前の場所からのスタックトレースの末尾--- at System.Runtime.CompilerServices.TaskAwaiter。 ThrowForNonSuccess(タスクタスク) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(タスクタスク) at Template10.Services.NavigationService.NavigationService.Navigate(タイプページ、オブジェクトパラメータ、NavigationTransitionInfo infoOverride)at Template10.Services.ViewService.ViewService。 <> c__DisplayClass1_0。 < b__0> d.MoveNext() ---例外がスローされた前の場所からのスタックトレースの末尾---at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(タスクタスク) at System.Runtime.CompilerServices.TaskAwaiter .HandleNonSuccessAndDebuggerNotification(タスクタスク) at Template10.Services.ViewService.ViewService.d__1.MoveNext() ---例外がスローされた前の場所からのスタックトレースの末尾--- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (タスクのタスク)System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(タスクのタスク)で System.Runtime.CompilerServices.TaskAwaiter`1.GetResult(AT ) Uwp.Main.ViewModels.MyPrimarでyShellViewModel。 <> c__DisplayClass63_0。 < b__0> d.MoveNext()

MySecondaryShellこのように構成されている:私は、そのシェルと主ウィンドウを開くと

public static HamburgerMenu HamburgerMenu => Instance.EmulatorHamburgerMenu; 

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

、Iは、シェルオブジェクトを作成し、それに対してのNavigationServiceを割り当てます。

しかし、セカンダリウィンドウを開くときに、typeof(MySecondaryShell)をパラメータとしてNavigationService.OpenAsyncを呼び出すだけです。 NavigationServiceがシェルで正しく設定されていないという問題はありますか? (my last questionのTemplate10コードを読むと、NavigationServiceがどこに設定されているのかわかりませんでした)。

シェルをセカンダリウィンドウとして開くにはどうすればよいですか?

+0

あなたはすべての更新プログラムを持っていますか? –

+0

@ NicoZhu-MSFTこんにちは、ごめんなさい - この素晴らしい答えに感謝します! –

答えて

1

セカンダリウィンドウとしてシェルを開くにはどうすればよいですか?

問題は、ナビサービスを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)); 
    }); 

}); 
関連する問題