Skip to content

Commit a2d197f

Browse files
committed
Refactor | Page Routing
1 parent 0e2a200 commit a2d197f

File tree

7 files changed

+30
-43
lines changed

7 files changed

+30
-43
lines changed

ShadowViewer/Pages/NavigationPage.xaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@
6363
<NavigationViewItem
6464
Content="{x:Bind Content, Mode=OneWay}"
6565
Icon="{x:Bind Icon, Mode=OneWay}"
66-
Tag="{x:Bind}" />
66+
Tag="{x:Bind Uri, Mode=OneWay}" />
6767
</DataTemplate>
6868
</NavigationView.MenuItemTemplate>
6969
</NavigationView>

ShadowViewer/Pages/NavigationPage.xaml.cs

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@
1111
using ShadowViewer.Sdk.Args;
1212
using ShadowViewer.Sdk.Enums;
1313
using ShadowViewer.Sdk.Models.Interfaces;
14+
using ShadowViewer.Sdk.Navigation;
1415
using ShadowViewer.Sdk.Services;
16+
using ShadowViewer.Sdk.Utils;
1517
using ShadowViewer.ViewModels;
1618
using ShadowViewer.Services;
1719

@@ -25,10 +27,13 @@ public sealed partial class NavigationPage
2527
private INotifyService NotifyService { get; } = DiFactory.Services.Resolve<INotifyService>();
2628
private PluginEventService PluginEventService { get; } = DiFactory.Services.Resolve<PluginEventService>();
2729

30+
private INavigateService NavigateService { get; }
31+
2832
public NavigationPage()
2933
{
3034
this.InitializeComponent();
31-
35+
ShadowRouteRegistry.RegisterPage(new ShadowNavigation(typeof(SettingsPage), SelectItemId: "_settings"),
36+
"settings");
3237
DiFactory.Services.Register<INavigateService, NavigateService>(reuse: Reuse.Singleton,
3338
made: Parameters.Of.Type(_ => ContentFrame));
3439
ViewModel.InitItems();
@@ -37,7 +42,8 @@ public NavigationPage()
3742
PluginEventService.PluginDisabled += CallerOnPluginEnabledEvent;
3843
NotifyService.TipPopupEvent += NotifyService_TipPopupEvent;
3944
Caller.TopLevelControlEvent += CallerTopLevelControlEvent;
40-
DiFactory.Services.Resolve<INavigateService>().TrySelectItemEvent += TrySelectItemCaller;
45+
NavigateService = DiFactory.Services.Resolve<INavigateService>();
46+
NavigateService.TrySelectItemEvent += TrySelectItemCaller;
4147
}
4248

4349
/// <summary>
@@ -50,8 +56,10 @@ private void TrySelectItemCaller(object? sender, TrySelectItemEventArgs e)
5056
if (e.Id == "_settings") item = NavView.SettingsItem;
5157
else
5258
{
53-
item = ViewModel.MenuItems.FirstOrDefault(x => x.Id == e.Id) ?? ViewModel.FooterMenuItems.FirstOrDefault(x => x.Id == e.Id);
59+
item = ViewModel.MenuItems.FirstOrDefault(x => x.Id == e.Id) ??
60+
ViewModel.FooterMenuItems.FirstOrDefault(x => x.Id == e.Id);
5461
}
62+
5563
if (item == null) return;
5664
NavView.SelectedItem = item;
5765
}
@@ -106,12 +114,10 @@ private void NavView_ItemInvoked(NavigationView sender, NavigationViewItemInvoke
106114
page = typeof(SettingsPage);
107115
}
108116
else if (args.InvokedItemContainer != null &&
109-
args.InvokedItemContainer.Tag is IShadowNavigationItem item &&
110-
ViewModel.NavigationViewItemInvokedHandler(item) is { } navigation)
117+
args.InvokedItemContainer.Tag is ShadowUri uri)
111118
{
112-
parameter = navigation.Parameter;
113-
page = navigation.Page;
114-
info = navigation.Info;
119+
NavigateService.Navigate(uri);
120+
return;
115121
}
116122

117123
if (page == null || ContentFrame.CurrentSourcePageType == page) return;
Lines changed: 11 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
11
using System;
2-
using DryIoc;
32
using Microsoft.UI.Xaml.Controls;
43
using Microsoft.UI.Xaml.Media.Animation;
54
using ShadowPluginLoader.Attributes;
6-
using ShadowPluginLoader.WinUI;
7-
using ShadowViewer.Pages;
85
using ShadowViewer.Sdk.Args;
9-
using ShadowViewer.Sdk.Helpers;
6+
using ShadowViewer.Sdk.Navigation;
107
using ShadowViewer.Sdk.Services;
118

129
namespace ShadowViewer.Services;
@@ -32,27 +29,17 @@ public void Navigate(Type page, object? parameter = null,
3229
TrySelectItemEvent?.Invoke(this, new TrySelectItemEventArgs(selectItemId));
3330
}
3431

35-
public void Navigate(Uri uri)
32+
public void Navigate(ShadowUri uri, NavigationTransitionInfo? info = null)
3633
{
3734
if (uri.Scheme != "shadow") return;
38-
var urls = uri.AbsolutePath.Split(['/'], StringSplitOptions.RemoveEmptyEntries);
39-
switch (uri.Host)
40-
{
41-
case "settings":
42-
Navigate(typeof(SettingsPage), selectItemId: "_settings");
43-
return;
44-
default:
45-
if (ResponderHelper.GetEnabledNavigateResponder(uri.Host) is { } responder)
46-
{
47-
var res = responder.Navigate(uri, urls);
48-
if (res == null) return;
49-
Navigate(res.Page, res.Parameter, res.Info, res.Force, res.SelectItemId);
50-
}
51-
else
52-
{
53-
DiFactory.Services.Resolve<INotifyService>().NotifyTip(this, $"shadow://{uri.Host}所属的应用不存在,请确认是否安装后重新唤起", InfoBarSeverity.Error, 4D);
54-
}
55-
break;
56-
}
35+
36+
var item = ShadowRouteRegistry.ResolvePage(uri);
37+
if (item == null) return;
38+
Navigate(item.Page, item.Parameter ?? uri, item.Info ?? info, item.Force, item.SelectItemId);
39+
}
40+
41+
public void Navigate(Uri uri, NavigationTransitionInfo? info = null)
42+
{
43+
Navigate(ShadowUri.Parse(uri), info);
5744
}
5845
}

ShadowViewer/ViewModels/NavigationViewModel.cs

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
using ShadowViewer.Sdk.Models.Interfaces;
77
using ShadowViewer.Sdk;
88
using ShadowViewer.Sdk.Helpers;
9-
using ShadowViewer.Sdk.Utils;
109

1110
namespace ShadowViewer.ViewModels;
1211

@@ -30,12 +29,7 @@ public NavigationViewModel(PluginLoader pluginService)
3029
/// 导航栏底部菜单
3130
/// </summary>
3231
public readonly ObservableCollection<IShadowNavigationItem> FooterMenuItems = [];
33-
34-
public ShadowNavigation? NavigationViewItemInvokedHandler(IShadowNavigationItem item)
35-
{
36-
var responder = ResponderHelper.GetEnabledResponder<INavigationResponder>(item.PluginId);
37-
return responder?.NavigationViewItemInvokedHandler(item);
38-
}
32+
3933

4034
/// <summary>
4135
/// 添加导航栏个体

0 commit comments

Comments
 (0)