using System; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Media.Animation; using Windows.UI.Xaml.Navigation; namespace Microsoft.PowerToys.Settings.UI.Services { public static class NavigationService { public static event NavigatedEventHandler Navigated; public static event NavigationFailedEventHandler NavigationFailed; private static Frame _frame; private static object _lastParamUsed; public static Frame Frame { get { if (_frame == null) { _frame = Window.Current.Content as Frame; RegisterFrameEvents(); } return _frame; } set { UnregisterFrameEvents(); _frame = value; RegisterFrameEvents(); } } public static bool CanGoBack => Frame.CanGoBack; public static bool CanGoForward => Frame.CanGoForward; public static bool GoBack() { if (CanGoBack) { Frame.GoBack(); return true; } return false; } public static void GoForward() => Frame.GoForward(); public static bool Navigate(Type pageType, object parameter = null, NavigationTransitionInfo infoOverride = null) { // Don't open the same page multiple times if (Frame.Content?.GetType() != pageType || (parameter != null && !parameter.Equals(_lastParamUsed))) { var navigationResult = Frame.Navigate(pageType, parameter, infoOverride); if (navigationResult) { _lastParamUsed = parameter; } return navigationResult; } else { return false; } } public static bool Navigate(object parameter = null, NavigationTransitionInfo infoOverride = null) where T : Page => Navigate(typeof(T), parameter, infoOverride); private static void RegisterFrameEvents() { if (_frame != null) { _frame.Navigated += Frame_Navigated; _frame.NavigationFailed += Frame_NavigationFailed; } } private static void UnregisterFrameEvents() { if (_frame != null) { _frame.Navigated -= Frame_Navigated; _frame.NavigationFailed -= Frame_NavigationFailed; } } private static void Frame_NavigationFailed(object sender, NavigationFailedEventArgs e) => NavigationFailed?.Invoke(sender, e); private static void Frame_Navigated(object sender, NavigationEventArgs e) => Navigated?.Invoke(sender, e); } }