private static void OnTargetChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { var element = d as FrameworkElement; var target = e.NewValue as ContentControl; if (element != null && target != null) { // NavigationServiceExのインスタンスを、添付対象のコントロールに付加する。 var nav = new NavigationServiceEx(); NavigationServiceEx.SetNavigator(element, nav); // ContentプロパティとTargetをバインドしておく。 BindingOperations.SetBinding(nav, NavigationServiceEx.ContentProperty, new Binding() { Source = target }); // ナビゲーション用のコマンドバインディング element.CommandBindings.Add(new CommandBinding(NavigationCommands.GoToPage, nav.OnGoToPage)); var startup = NavigationServiceEx.GetStartup(element); if (startup != null) { nav.Navigate(startup); } } }
private static void OnStartupChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { var element = d as FrameworkElement; var startupType = e.NewValue as Type; if (element != null && startupType != null) { var nav = NavigationServiceEx.GetNavigator(element); nav?.Navigate(startupType); } }
/// <summary> /// viewType引数で指定された型のインスタンスを生成し、そのインスタンスのページへとナビゲーションを行います。 /// </summary> /// <param name="element"></param> /// <param name="viewType"></param> /// <returns></returns> public static bool Navigate(this FrameworkElement element, Type viewType) { var navigator = NavigationServiceEx.GetNavigator(element); return(navigator.Navigate(viewType)); }
// ↓protectedにして外部からは利用できないように。 public static void SetNavigator(DependencyObject obj, NavigationServiceEx value) { obj.SetValue(NavigatorProperty, value); }