Skip to content

Commit 5000ba2

Browse files
committed
ReWrite NavigationServiceEx
1 parent d56e233 commit 5000ba2

9 files changed

Lines changed: 362 additions & 340 deletions

File tree

dev/DevWinUI/Services/NavigationService/Contracts/INavigationServiceEx.cs

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,23 @@
22

33
public interface INavigationServiceEx
44
{
5-
event NavigatedEventHandler Navigated;
5+
void UnregisterEvents();
66

7-
bool CanGoBack
8-
{
9-
get;
10-
}
11-
12-
Frame? Frame
13-
{
14-
get; set;
15-
}
16-
17-
Microsoft.UI.Xaml.Window? Window
18-
{
19-
get; set;
20-
}
21-
22-
bool NavigateTo(string pageKey, object? parameter = null, bool clearNavigation = false, NavigationTransitionInfo transitionInfo = null);
7+
event NavigatedEventHandler FrameNavigated;
8+
IList<object>? MenuItems { get; }
9+
object? SettingsItem { get; }
10+
bool CanGoBack { get; }
11+
Frame? Frame { get; set; }
2312
bool NavigateTo(Type pageType, object? parameter = null, bool clearNavigation = false, NavigationTransitionInfo transitionInfo = null);
24-
2513
bool GoBack();
14+
void Reset();
15+
void EnsureNavigationSelection(Type type);
16+
NavigationServiceEx Initialize(NavigationView navigationView, Frame frame);
17+
NavigationServiceEx ConfigureDefaultPage(Type defaultPage);
18+
NavigationServiceEx ConfigureSettingsPage(Type settingsPage);
19+
NavigationServiceEx ConfigureBreadcrumbBar(BreadcrumbNavigator breadcrumbBar, Dictionary<Type, BreadcrumbPageConfig> pageDictionary);
20+
NavigationServiceEx ConfigureBreadcrumbBar(BreadcrumbNavigator breadcrumbBar, Dictionary<Type, BreadcrumbPageConfig> pageDictionary, BreadcrumbNavigatorHeaderVisibilityOptions headerVisibilityOptions);
21+
NavigationServiceEx ConfigureBreadcrumbBar(BreadcrumbNavigator breadcrumbBar, Dictionary<Type, BreadcrumbPageConfig> pageDictionary, NavigationTransitionInfo navigationTransitionInfo);
22+
NavigationServiceEx ConfigureBreadcrumbBar(BreadcrumbNavigator breadcrumbBar, Dictionary<Type, BreadcrumbPageConfig> pageDictionary, BreadcrumbNavigatorHeaderVisibilityOptions headerVisibilityOptions, NavigationTransitionInfo navigationTransitionInfo);
23+
NavigationServiceEx ConfigureTitleBar(TitleBar titleBar);
2624
}

dev/DevWinUI/Services/NavigationService/Contracts/INavigationViewServiceEx.cs

Lines changed: 0 additions & 21 deletions
This file was deleted.

dev/DevWinUI/Services/NavigationService/Extensions/NavigationHelperEx.cs

Lines changed: 0 additions & 38 deletions
This file was deleted.
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
namespace DevWinUI;
2+
public partial class NavigationServiceEx
3+
{
4+
public static object GetParameter(DependencyObject obj)
5+
{
6+
return (object)obj.GetValue(ParameterProperty);
7+
}
8+
9+
public static void SetParameter(DependencyObject obj, object value)
10+
{
11+
obj.SetValue(ParameterProperty, value);
12+
}
13+
14+
public static readonly DependencyProperty ParameterProperty =
15+
DependencyProperty.RegisterAttached("Parameter", typeof(object), typeof(NavigationServiceEx), new PropertyMetadata(null));
16+
17+
18+
internal static Type GetParent(DependencyObject obj)
19+
{
20+
return (Type)obj.GetValue(ParentProperty);
21+
}
22+
23+
internal static void SetParent(DependencyObject obj, Type value)
24+
{
25+
obj.SetValue(ParentProperty, value);
26+
}
27+
28+
internal static readonly DependencyProperty ParentProperty =
29+
DependencyProperty.RegisterAttached("Parent", typeof(Type), typeof(NavigationServiceEx), new PropertyMetadata(null));
30+
31+
public static Type GetNavigateTo(DependencyObject obj)
32+
{
33+
return (Type)obj.GetValue(NavigateToProperty);
34+
}
35+
36+
public static void SetNavigateTo(DependencyObject obj, Type value)
37+
{
38+
obj.SetValue(NavigateToProperty, value);
39+
}
40+
41+
public static readonly DependencyProperty NavigateToProperty =
42+
DependencyProperty.RegisterAttached("NavigateTo", typeof(Type), typeof(NavigationServiceEx), new PropertyMetadata(null));
43+
}
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
namespace DevWinUI;
2+
3+
public partial class NavigationServiceEx
4+
{
5+
private bool _isInitialized;
6+
public NavigationServiceEx Initialize(NavigationView navigationView, Frame frame)
7+
{
8+
InitializeBase(navigationView, frame);
9+
10+
_isInitialized = true;
11+
12+
return this; // Enable chaining
13+
}
14+
15+
public NavigationServiceEx ConfigureDefaultPage(Type defaultPage)
16+
{
17+
EnsureInitialized();
18+
_defaultPage = defaultPage;
19+
EnsureNavigationSelection(_defaultPage);
20+
return this;
21+
}
22+
23+
public NavigationServiceEx ConfigureSettingsPage(Type settingsPage)
24+
{
25+
EnsureInitialized();
26+
_settingsPage = settingsPage;
27+
return this;
28+
}
29+
private void ConfigureBreadcrumbBarBase(BreadcrumbNavigator breadcrumbNavigator, Dictionary<Type, BreadcrumbPageConfig> pageDictionary)
30+
{
31+
_mainBreadcrumb = breadcrumbNavigator;
32+
_useBreadcrumbBar = false;
33+
34+
if (_mainBreadcrumb != null)
35+
{
36+
_mainBreadcrumb.Visibility = Visibility.Collapsed;
37+
_mainBreadcrumb.Initialize(Frame, _navigationView, pageDictionary);
38+
39+
_useBreadcrumbBar = true;
40+
_mainBreadcrumb.ChangeBreadcrumbVisibility(false);
41+
}
42+
}
43+
public NavigationServiceEx ConfigureBreadcrumbBar(BreadcrumbNavigator breadcrumbNavigator, Dictionary<Type, BreadcrumbPageConfig> pageDictionary)
44+
{
45+
EnsureInitialized();
46+
ConfigureBreadcrumbBarBase(breadcrumbNavigator, pageDictionary);
47+
return this;
48+
}
49+
50+
public NavigationServiceEx ConfigureBreadcrumbBar(BreadcrumbNavigator breadcrumbNavigator, Dictionary<Type, BreadcrumbPageConfig> pageDictionary, BreadcrumbNavigatorHeaderVisibilityOptions headerVisibilityOptions)
51+
{
52+
EnsureInitialized();
53+
breadcrumbNavigator.HeaderVisibilityOptions = headerVisibilityOptions;
54+
ConfigureBreadcrumbBarBase(breadcrumbNavigator, pageDictionary);
55+
return this;
56+
}
57+
58+
public NavigationServiceEx ConfigureBreadcrumbBar(BreadcrumbNavigator breadcrumbNavigator, Dictionary<Type, BreadcrumbPageConfig> pageDictionary, NavigationTransitionInfo navigationTransitionInfo)
59+
{
60+
EnsureInitialized();
61+
breadcrumbNavigator.NavigationTransitionInfo = navigationTransitionInfo;
62+
ConfigureBreadcrumbBarBase(breadcrumbNavigator, pageDictionary);
63+
return this;
64+
}
65+
66+
public NavigationServiceEx ConfigureBreadcrumbBar(BreadcrumbNavigator breadcrumbNavigator, Dictionary<Type, BreadcrumbPageConfig> pageDictionary, BreadcrumbNavigatorHeaderVisibilityOptions headerVisibilityOptions, NavigationTransitionInfo navigationTransitionInfo)
67+
{
68+
EnsureInitialized();
69+
breadcrumbNavigator.HeaderVisibilityOptions = headerVisibilityOptions;
70+
breadcrumbNavigator.NavigationTransitionInfo = navigationTransitionInfo;
71+
ConfigureBreadcrumbBarBase(breadcrumbNavigator, pageDictionary);
72+
return this;
73+
}
74+
75+
private void ConfigureTitleBarBase(TitleBar titleBar, bool autoManageBackButtonVisibility)
76+
{
77+
_titleBar = titleBar;
78+
titleBar.BackRequested -= OnBackRequested;
79+
titleBar.BackRequested += OnBackRequested;
80+
titleBar.PaneToggleRequested -= OnPaneToggleRequested;
81+
titleBar.PaneToggleRequested += OnPaneToggleRequested;
82+
_autoManageBackButtonVisibility = autoManageBackButtonVisibility;
83+
if (_autoManageBackButtonVisibility)
84+
{
85+
_titleBar.IsBackButtonVisible = _frame.CanGoBack;
86+
}
87+
88+
_isTitlebarConfigured = true;
89+
}
90+
private void OnBackRequested(TitleBar sender, object args)
91+
{
92+
GoBack();
93+
}
94+
private void OnPaneToggleRequested(TitleBar sender, object args)
95+
{
96+
_navigationView.IsPaneOpen = !_navigationView.IsPaneOpen;
97+
}
98+
public NavigationServiceEx ConfigureTitleBar(TitleBar titleBar)
99+
{
100+
EnsureInitialized();
101+
ConfigureTitleBarBase(titleBar, true);
102+
return this;
103+
}
104+
public NavigationServiceEx ConfigureTitleBar(TitleBar titleBar, bool autoManageBackButtonVisibility)
105+
{
106+
EnsureInitialized();
107+
ConfigureTitleBarBase(titleBar, autoManageBackButtonVisibility);
108+
return this;
109+
}
110+
private void EnsureInitialized()
111+
{
112+
if (!_isInitialized)
113+
throw new InvalidOperationException("Service must be initialized before configuration.");
114+
}
115+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
namespace DevWinUI;
2+
3+
public partial class NavigationServiceEx
4+
{
5+
private bool _useBreadcrumbBar;
6+
private bool _autoManageBackButtonVisibility;
7+
private BreadcrumbNavigator _mainBreadcrumb { get; set; }
8+
private NavigationView? _navigationView;
9+
public IList<object>? MenuItems => _navigationView?.MenuItems;
10+
public IList<object>? FooterMenuItems => _navigationView?.FooterMenuItems;
11+
private IList<object>? AllMenuItems => MenuItems.Concat(FooterMenuItems).ToList();
12+
public object? SettingsItem => _navigationView?.SettingsItem;
13+
14+
private Type _defaultPage;
15+
private Type _settingsPage;
16+
17+
private object? _lastParameterUsed;
18+
private Frame? _frame;
19+
public event NavigatedEventHandler? FrameNavigated;
20+
21+
private bool _isTitlebarConfigured;
22+
private TitleBar _titleBar;
23+
}

0 commit comments

Comments
 (0)