| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- using System;
- using System.Threading.Tasks;
- using Avalonia.Controls;
- using MiniMvvm;
- namespace ControlCatalog.Pages
- {
- internal interface ISampleNavigationService
- {
- event EventHandler<NavigationStateChangedEventArgs>? StateChanged;
- Task NavigateToAsync(ViewModelBase viewModel);
- Task GoBackAsync();
- Task PopToRootAsync();
- }
- internal interface ISamplePageFactory
- {
- ContentPage CreatePage(ViewModelBase viewModel);
- }
- internal sealed class NavigationStateChangedEventArgs : EventArgs
- {
- public NavigationStateChangedEventArgs(string currentPageHeader, int navigationDepth, string lastAction)
- {
- CurrentPageHeader = currentPageHeader;
- NavigationDepth = navigationDepth;
- LastAction = lastAction;
- }
- public string CurrentPageHeader { get; }
- public int NavigationDepth { get; }
- public string LastAction { get; }
- }
- internal sealed class SampleNavigationService : ISampleNavigationService
- {
- private readonly NavigationPage _navigationPage;
- private readonly ISamplePageFactory _pageFactory;
- public SampleNavigationService(NavigationPage navigationPage, ISamplePageFactory pageFactory)
- {
- _navigationPage = navigationPage;
- _pageFactory = pageFactory;
- _navigationPage.Pushed += (_, e) => PublishState($"Pushed {e.Page?.Header}");
- _navigationPage.Popped += (_, e) => PublishState($"Popped {e.Page?.Header}");
- _navigationPage.PoppedToRoot += (_, _) => PublishState("Popped to root");
- }
- public event EventHandler<NavigationStateChangedEventArgs>? StateChanged;
- public async Task NavigateToAsync(ViewModelBase viewModel)
- {
- var page = _pageFactory.CreatePage(viewModel);
- await _navigationPage.PushAsync(page);
- }
- public async Task GoBackAsync()
- {
- if (_navigationPage.NavigationStack.Count <= 1)
- {
- PublishState("Already at the root page");
- return;
- }
- await _navigationPage.PopAsync();
- }
- public async Task PopToRootAsync()
- {
- if (_navigationPage.NavigationStack.Count <= 1)
- {
- PublishState("Already at the root page");
- return;
- }
- await _navigationPage.PopToRootAsync();
- }
- private void PublishState(string lastAction)
- {
- var header = _navigationPage.CurrentPage?.Header?.ToString() ?? "None";
- StateChanged?.Invoke(this, new NavigationStateChangedEventArgs(
- header,
- _navigationPage.NavigationStack.Count,
- lastAction));
- }
- }
- }
|