diff --git a/BetterGenshinImpact/App.xaml.cs b/BetterGenshinImpact/App.xaml.cs index 24a268b6..726675e9 100644 --- a/BetterGenshinImpact/App.xaml.cs +++ b/BetterGenshinImpact/App.xaml.cs @@ -11,7 +11,6 @@ using BetterGenshinImpact.View.Pages; using BetterGenshinImpact.ViewModel; using BetterGenshinImpact.ViewModel.Pages; using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Serilog; @@ -22,10 +21,9 @@ using System.Diagnostics; using System.IO; using System.Threading.Tasks; using System.Windows; -using BetterGenshinImpact.View.Pages.View; -using BetterGenshinImpact.ViewModel.Pages.OneDragon; using BetterGenshinImpact.ViewModel.Pages.View; using Wpf.Ui; +using Wpf.Ui.DependencyInjection; using Wpf.Ui.Violeta.Controls; namespace BetterGenshinImpact; @@ -73,10 +71,11 @@ public partial class App : Application Log.Logger = loggerConfiguration.CreateLogger(); services.AddLogging(c => c.AddSerilog()); + services.AddNavigationViewPageProvider(); // App Host services.AddHostedService(); // Page resolver service - services.AddSingleton(); + services.AddSingleton(); services.AddSingleton(); // Service containing navigation, same as INavigationWindow... but without window diff --git a/BetterGenshinImpact/BetterGenshinImpact.csproj b/BetterGenshinImpact/BetterGenshinImpact.csproj index 8cc71df9..0db4b383 100644 --- a/BetterGenshinImpact/BetterGenshinImpact.csproj +++ b/BetterGenshinImpact/BetterGenshinImpact.csproj @@ -75,9 +75,10 @@ - - - + + + + diff --git a/BetterGenshinImpact/Service/ApplicationHostService.cs b/BetterGenshinImpact/Service/ApplicationHostService.cs index d940c241..68933269 100644 --- a/BetterGenshinImpact/Service/ApplicationHostService.cs +++ b/BetterGenshinImpact/Service/ApplicationHostService.cs @@ -13,16 +13,10 @@ namespace BetterGenshinImpact.Service; /// /// Managed host of the application. /// -public class ApplicationHostService : IHostedService +public class ApplicationHostService(IServiceProvider serviceProvider) : IHostedService { - private readonly IServiceProvider _serviceProvider; private INavigationWindow? _navigationWindow; - public ApplicationHostService(IServiceProvider serviceProvider) - { - _serviceProvider = serviceProvider; - } - /// /// Triggered when the application host is ready to start the service. /// @@ -50,12 +44,10 @@ public class ApplicationHostService : IHostedService if (!Application.Current.Windows.OfType().Any()) { - _navigationWindow = ( - _serviceProvider.GetService(typeof(INavigationWindow)) as INavigationWindow - )!; + _navigationWindow = (serviceProvider.GetService(typeof(INavigationWindow)) as INavigationWindow)!; _navigationWindow!.ShowWindow(); - _navigationWindow.Navigate(typeof(HomePage)); + _ = _navigationWindow.Navigate(typeof(HomePage)); } await Task.CompletedTask; diff --git a/BetterGenshinImpact/Service/PageService.cs b/BetterGenshinImpact/Service/PageService.cs index 3aed2475..411b3358 100644 --- a/BetterGenshinImpact/Service/PageService.cs +++ b/BetterGenshinImpact/Service/PageService.cs @@ -1,46 +1,46 @@ -using System; -using System.Windows; -using Wpf.Ui; - -namespace BetterGenshinImpact.Service; - -/// -/// Service that provides pages for navigation. -/// -public class PageService : IPageService -{ - /// - /// Service which provides the instances of pages. - /// - private readonly IServiceProvider _serviceProvider; - - /// - /// Creates new instance and attaches the . - /// - public PageService(IServiceProvider serviceProvider) - { - _serviceProvider = serviceProvider; - } - - /// - public T? GetPage() where T : class - { - if (!typeof(FrameworkElement).IsAssignableFrom(typeof(T))) - { - throw new InvalidOperationException("The page should be a WPF control."); - } - - return (T?)_serviceProvider.GetService(typeof(T)); - } - - /// - public FrameworkElement? GetPage(Type pageType) - { - if (!typeof(FrameworkElement).IsAssignableFrom(pageType)) - { - throw new InvalidOperationException("The page should be a WPF control."); - } - - return _serviceProvider.GetService(pageType) as FrameworkElement; - } -} \ No newline at end of file +// using System; +// using System.Windows; +// using Wpf.Ui; +// +// namespace BetterGenshinImpact.Service; +// +// /// +// /// Service that provides pages for navigation. +// /// +// public class PageService : IPageService +// { +// /// +// /// Service which provides the instances of pages. +// /// +// private readonly IServiceProvider _serviceProvider; +// +// /// +// /// Creates new instance and attaches the . +// /// +// public PageService(IServiceProvider serviceProvider) +// { +// _serviceProvider = serviceProvider; +// } +// +// /// +// public T? GetPage() where T : class +// { +// if (!typeof(FrameworkElement).IsAssignableFrom(typeof(T))) +// { +// throw new InvalidOperationException("The page should be a WPF control."); +// } +// +// return (T?)_serviceProvider.GetService(typeof(T)); +// } +// +// /// +// public FrameworkElement? GetPage(Type pageType) +// { +// if (!typeof(FrameworkElement).IsAssignableFrom(pageType)) +// { +// throw new InvalidOperationException("The page should be a WPF control."); +// } +// +// return _serviceProvider.GetService(pageType) as FrameworkElement; +// } +// } \ No newline at end of file diff --git a/BetterGenshinImpact/View/MainWindow.xaml b/BetterGenshinImpact/View/MainWindow.xaml index a97bd5bc..8d5410dc 100644 --- a/BetterGenshinImpact/View/MainWindow.xaml +++ b/BetterGenshinImpact/View/MainWindow.xaml @@ -177,7 +177,7 @@ - + - + _logger = App.GetLogger(); public MainWindowViewModel ViewModel { get; } - public MainWindow(MainWindowViewModel viewModel, IPageService pageService, INavigationService navigationService, ISnackbarService snackbarService) + public MainWindow(MainWindowViewModel viewModel, INavigationService navigationService, ISnackbarService snackbarService) { _logger.LogDebug("主窗体实例化"); DataContext = ViewModel = viewModel; @@ -26,7 +27,6 @@ public partial class MainWindow : FluentWindow, INavigationWindow InitializeComponent(); this.InitializeDpiAwareness(); - SetPageService(pageService); snackbarService.SetSnackbarPresenter(SnackbarPresenter); navigationService.SetNavigationControl(RootNavigation); @@ -62,10 +62,8 @@ public partial class MainWindow : FluentWindow, INavigationWindow throw new NotImplementedException(); } - public void SetPageService(IPageService pageService) - { - RootNavigation.SetPageService(pageService); - } + public void SetPageService(INavigationViewPageProvider navigationViewPageProvider) => + RootNavigation.SetPageProviderService(navigationViewPageProvider); public void ShowWindow() => Show(); diff --git a/BetterGenshinImpact/ViewModel/Pages/CommonSettingsPageViewModel.cs b/BetterGenshinImpact/ViewModel/Pages/CommonSettingsPageViewModel.cs index f7750893..31c03b9f 100644 --- a/BetterGenshinImpact/ViewModel/Pages/CommonSettingsPageViewModel.cs +++ b/BetterGenshinImpact/ViewModel/Pages/CommonSettingsPageViewModel.cs @@ -27,7 +27,7 @@ using Wpf.Ui.Violeta.Controls; namespace BetterGenshinImpact.ViewModel.Pages; -public partial class CommonSettingsPageViewModel : ObservableObject, INavigationAware, IViewModel +public partial class CommonSettingsPageViewModel : ViewModel { public AllConfig Config { get; set; } @@ -136,14 +136,6 @@ public partial class CommonSettingsPageViewModel : ObservableObject, INavigation InitializeCountries(); } - public void OnNavigatedTo() - { - } - - public void OnNavigatedFrom() - { - } - [RelayCommand] public void OnRefreshMaskSettings() { diff --git a/BetterGenshinImpact/ViewModel/Pages/HomePageViewModel.cs b/BetterGenshinImpact/ViewModel/Pages/HomePageViewModel.cs index f27dd987..a3936b94 100644 --- a/BetterGenshinImpact/ViewModel/Pages/HomePageViewModel.cs +++ b/BetterGenshinImpact/ViewModel/Pages/HomePageViewModel.cs @@ -27,7 +27,7 @@ using Wpf.Ui.Controls; namespace BetterGenshinImpact.ViewModel.Pages; -public partial class HomePageViewModel : ObservableObject, INavigationAware, IViewModel +public partial class HomePageViewModel : ViewModel { [ObservableProperty] private string[] _modeNames = GameCaptureFactory.ModeNames(); @@ -293,14 +293,6 @@ public partial class HomePageViewModel : ObservableObject, INavigationAware, IVi UIDispatcherHelper.Invoke(() => Start(_hWnd)); } - public void OnNavigatedTo() - { - } - - public void OnNavigatedFrom() - { - } - [RelayCommand] public void OnGoToWikiUrl() { diff --git a/BetterGenshinImpact/ViewModel/Pages/JsListViewModel.cs b/BetterGenshinImpact/ViewModel/Pages/JsListViewModel.cs index ffab9822..c5528bb6 100644 --- a/BetterGenshinImpact/ViewModel/Pages/JsListViewModel.cs +++ b/BetterGenshinImpact/ViewModel/Pages/JsListViewModel.cs @@ -21,7 +21,7 @@ using Wpf.Ui.Violeta.Controls; namespace BetterGenshinImpact.ViewModel.Pages; -public partial class JsListViewModel : ObservableObject, INavigationAware, IViewModel +public partial class JsListViewModel : ViewModel { private readonly ILogger _logger = App.GetLogger(); private readonly string scriptPath = Global.ScriptPath(); @@ -71,15 +71,11 @@ public partial class JsListViewModel : ObservableObject, INavigationAware, IView return di.GetDirectories(); } - public void OnNavigatedTo() + public override void OnNavigatedTo() { InitScriptListViewData(); } - public void OnNavigatedFrom() - { - } - [RelayCommand] public void OnOpenScriptsFolder() { diff --git a/BetterGenshinImpact/ViewModel/Pages/KeyBindingsSettingsPageViewModel.cs b/BetterGenshinImpact/ViewModel/Pages/KeyBindingsSettingsPageViewModel.cs index 7e185a5f..ec29d681 100644 --- a/BetterGenshinImpact/ViewModel/Pages/KeyBindingsSettingsPageViewModel.cs +++ b/BetterGenshinImpact/ViewModel/Pages/KeyBindingsSettingsPageViewModel.cs @@ -18,7 +18,7 @@ using static Vanara.PInvoke.User32; namespace BetterGenshinImpact.ViewModel.Pages; -public partial class KeyBindingsSettingsPageViewModel : ObservableObject, INavigationAware, IViewModel +public partial class KeyBindingsSettingsPageViewModel : ViewModel { private readonly ILogger _logger; @@ -30,14 +30,6 @@ public partial class KeyBindingsSettingsPageViewModel : ObservableObject, INavig [ObservableProperty] private ObservableCollection _keyBindingSettingModels = []; - public void OnNavigatedFrom() - { - } - - public void OnNavigatedTo() - { - } - public KeyBindingsSettingsPageViewModel(IConfigService configService, ILogger logger) { _logger = logger; diff --git a/BetterGenshinImpact/ViewModel/Pages/KeyMouseRecordPageViewModel.cs b/BetterGenshinImpact/ViewModel/Pages/KeyMouseRecordPageViewModel.cs index cecf68fd..52206e70 100644 --- a/BetterGenshinImpact/ViewModel/Pages/KeyMouseRecordPageViewModel.cs +++ b/BetterGenshinImpact/ViewModel/Pages/KeyMouseRecordPageViewModel.cs @@ -22,7 +22,7 @@ using Wpf.Ui.Violeta.Controls; namespace BetterGenshinImpact.ViewModel.Pages; -public partial class KeyMouseRecordPageViewModel : ObservableObject, INavigationAware, IViewModel +public partial class KeyMouseRecordPageViewModel : ViewModel { private readonly ILogger _logger = App.GetLogger(); private readonly string scriptPath = Global.Absolute(@"User\KeyMouseScript"); @@ -74,15 +74,11 @@ public partial class KeyMouseRecordPageViewModel : ObservableObject, INavigation return files.Select(file => new FileInfo(file)).ToList(); } - public void OnNavigatedTo() + public override void OnNavigatedTo() { InitScriptListViewData(); } - public void OnNavigatedFrom() - { - } - [RelayCommand] public async Task OnStartRecord() { diff --git a/BetterGenshinImpact/ViewModel/Pages/MacroSettingsPageViewModel.cs b/BetterGenshinImpact/ViewModel/Pages/MacroSettingsPageViewModel.cs index d28fc063..2de4ffe9 100644 --- a/BetterGenshinImpact/ViewModel/Pages/MacroSettingsPageViewModel.cs +++ b/BetterGenshinImpact/ViewModel/Pages/MacroSettingsPageViewModel.cs @@ -11,7 +11,7 @@ using Wpf.Ui.Controls; namespace BetterGenshinImpact.ViewModel.Pages; -public partial class MacroSettingsPageViewModel : ObservableObject, INavigationAware, IViewModel +public partial class MacroSettingsPageViewModel : ViewModel { public AllConfig Config { get; set; } @@ -25,15 +25,7 @@ public partial class MacroSettingsPageViewModel : ObservableObject, INavigationA Config = configService.Get(); _navigationService = navigationService; } - - public void OnNavigatedTo() - { - } - - public void OnNavigatedFrom() - { - } - + [RelayCommand] public void OnGoToHotKeyPage() { diff --git a/BetterGenshinImpact/ViewModel/Pages/MapPathingViewModel.cs b/BetterGenshinImpact/ViewModel/Pages/MapPathingViewModel.cs index 4bbc3dfd..74ef2251 100644 --- a/BetterGenshinImpact/ViewModel/Pages/MapPathingViewModel.cs +++ b/BetterGenshinImpact/ViewModel/Pages/MapPathingViewModel.cs @@ -17,17 +17,14 @@ using System.Threading.Tasks; using BetterGenshinImpact.Core.Script; using BetterGenshinImpact.ViewModel.Message; using CommunityToolkit.Mvvm.Messaging; -using Wpf.Ui.Controls; using Wpf.Ui.Violeta.Controls; -using System.Windows; -using BetterGenshinImpact.GameTask; using BetterGenshinImpact.View.Pages.View; using BetterGenshinImpact.ViewModel.Pages.View; using Wpf.Ui.Violeta.Win32; namespace BetterGenshinImpact.ViewModel.Pages; -public partial class MapPathingViewModel : ObservableObject, INavigationAware, IViewModel +public partial class MapPathingViewModel : ViewModel { private readonly ILogger _logger = App.GetLogger(); public static readonly string PathJsonPath = Global.Absolute(@"User\AutoPathing"); @@ -74,15 +71,11 @@ public partial class MapPathingViewModel : ObservableObject, INavigationAware, I } } - public void OnNavigatedTo() + public override void OnNavigatedTo() { InitScriptListViewData(); } - public void OnNavigatedFrom() - { - } - [RelayCommand] public void OnOpenScriptsFolder() { diff --git a/BetterGenshinImpact/ViewModel/Pages/OneDragonFlowViewModel.cs b/BetterGenshinImpact/ViewModel/Pages/OneDragonFlowViewModel.cs index 9ab483c0..f4c01070 100644 --- a/BetterGenshinImpact/ViewModel/Pages/OneDragonFlowViewModel.cs +++ b/BetterGenshinImpact/ViewModel/Pages/OneDragonFlowViewModel.cs @@ -28,7 +28,7 @@ using Wpf.Ui.Violeta.Controls; namespace BetterGenshinImpact.ViewModel.Pages; -public partial class OneDragonFlowViewModel : ObservableObject, INavigationAware, IViewModel +public partial class OneDragonFlowViewModel : ViewModel { private readonly ILogger _logger = App.GetLogger(); @@ -97,7 +97,7 @@ public partial class OneDragonFlowViewModel : ObservableObject, INavigationAware InitConfigList(); } - public void OnNavigatedTo() + public override void OnNavigatedTo() { InitConfigList(); } diff --git a/BetterGenshinImpact/ViewModel/Pages/ScriptControlViewModel.cs b/BetterGenshinImpact/ViewModel/Pages/ScriptControlViewModel.cs index e152758e..b5709493 100644 --- a/BetterGenshinImpact/ViewModel/Pages/ScriptControlViewModel.cs +++ b/BetterGenshinImpact/ViewModel/Pages/ScriptControlViewModel.cs @@ -41,7 +41,7 @@ using TextBlock = Wpf.Ui.Controls.TextBlock; namespace BetterGenshinImpact.ViewModel.Pages; -public partial class ScriptControlViewModel : ObservableObject, INavigationAware, IViewModel +public partial class ScriptControlViewModel : ViewModel { private readonly ISnackbarService _snackbarService; @@ -63,12 +63,9 @@ public partial class ScriptControlViewModel : ObservableObject, INavigationAware public readonly string ScriptGroupPath = Global.Absolute(@"User\ScriptGroup"); public readonly string LogPath = Global.Absolute(@"log"); + - public void OnNavigatedFrom() - { - } - - public void OnNavigatedTo() + public override void OnNavigatedTo() { ReadScriptGroup(); } diff --git a/BetterGenshinImpact/ViewModel/Pages/TaskSettingsPageViewModel.cs b/BetterGenshinImpact/ViewModel/Pages/TaskSettingsPageViewModel.cs index 8a2f35c5..af7e7409 100644 --- a/BetterGenshinImpact/ViewModel/Pages/TaskSettingsPageViewModel.cs +++ b/BetterGenshinImpact/ViewModel/Pages/TaskSettingsPageViewModel.cs @@ -35,7 +35,7 @@ using Vanara.Extensions; namespace BetterGenshinImpact.ViewModel.Pages; -public partial class TaskSettingsPageViewModel : ObservableObject, INavigationAware, IViewModel +public partial class TaskSettingsPageViewModel : ViewModel { public AllConfig Config { get; set; } @@ -168,14 +168,6 @@ public partial class TaskSettingsPageViewModel : ObservableObject, INavigationAw _autoFightViewModel.OnStrategyDropDownOpened(type); } - public void OnNavigatedTo() - { - } - - public void OnNavigatedFrom() - { - } - [RelayCommand] public void OnGoToHotKeyPage() { diff --git a/BetterGenshinImpact/ViewModel/Pages/TriggerSettingsPageViewModel.cs b/BetterGenshinImpact/ViewModel/Pages/TriggerSettingsPageViewModel.cs index 918fc6e3..a07efeed 100644 --- a/BetterGenshinImpact/ViewModel/Pages/TriggerSettingsPageViewModel.cs +++ b/BetterGenshinImpact/ViewModel/Pages/TriggerSettingsPageViewModel.cs @@ -14,7 +14,7 @@ using Wpf.Ui.Controls; namespace BetterGenshinImpact.ViewModel.Pages; -public partial class TriggerSettingsPageViewModel : ObservableObject, INavigationAware, IViewModel +public partial class TriggerSettingsPageViewModel : ViewModel { [ObservableProperty] private string[] _clickChatOptionNames = ["优先选择第一个选项", "随机选择选项", "优先选择最后一个选项", "不选择选项"]; @@ -51,14 +51,6 @@ public partial class TriggerSettingsPageViewModel : ObservableObject, INavigatio } } - public void OnNavigatedTo() - { - } - - public void OnNavigatedFrom() - { - } - [RelayCommand] private void OnEditBlacklist() { diff --git a/BetterGenshinImpact/ViewModel/ViewModel.cs b/BetterGenshinImpact/ViewModel/ViewModel.cs new file mode 100644 index 00000000..50f639c2 --- /dev/null +++ b/BetterGenshinImpact/ViewModel/ViewModel.cs @@ -0,0 +1,36 @@ +using System.Threading.Tasks; +using CommunityToolkit.Mvvm.ComponentModel; +using Wpf.Ui.Abstractions.Controls; + +namespace BetterGenshinImpact.ViewModel; + +public abstract partial class ViewModel : ObservableObject, INavigationAware, IViewModel +{ + /// + public virtual Task OnNavigatedToAsync() + { + OnNavigatedTo(); + + return Task.CompletedTask; + } + + /// + /// Handles the event that is fired after the component is navigated to. + /// + // ReSharper disable once MemberCanBeProtected.Global + public virtual void OnNavigatedTo() { } + + /// + public virtual Task OnNavigatedFromAsync() + { + OnNavigatedFrom(); + + return Task.CompletedTask; + } + + /// + /// Handles the event that is fired before the component is navigated from. + /// + // ReSharper disable once MemberCanBeProtected.Global + public virtual void OnNavigatedFrom() { } +} \ No newline at end of file