/
githubmirror
/
PowerToys
Обзор
Документация
Войти
/
githubmirror
/
PowerToys
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/settings-ui/Settings.UI/Services/NavigationService.cs
124 строки
4 KB
Tucker Burns
Add defensive error handling for Settings navigation and search (#46688)
18 июн 2026, 12:15
Не верифицирован
18 июн 2026, 12:15
1415267
Код
Авторство
О чём код?
// Copyright (c) Microsoft Corporation // The Microsoft Corporation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. using System; using ManagedCommon; using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; using Microsoft.UI.Xaml.Media.Animation; using Microsoft.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 { 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))) { try { var navigationResult = Frame.Navigate(pageType, parameter, infoOverride); if (navigationResult) { lastParamUsed = parameter; } return navigationResult; } catch (Exception ex) { Logger.LogError($"Navigation to {pageType?.Name} failed with exception", ex); return false; } } else { return false; } } public static bool Navigate<T>(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); internal static void EnsurePageIsSelected(Type pageType) { if (Frame.Content == null) { try { Frame.Navigate(pageType); } catch (Exception ex) { Logger.LogError($"EnsurePageIsSelected failed for {pageType?.Name}", ex); } } } } }