@@ -55,6 +55,9 @@ public sealed partial class MainView : UserControl
5555
5656 private PageType OldPage_t = PageType . Null ;
5757 private PageType CurrentPage_t = PageType . Null ;
58+ private List < PageType > NavigationHistory = new ( ) ;
59+
60+ public event EventHandler < bool > ? CanGoBackChanged ;
5861
5962 public MainView ( )
6063 {
@@ -237,8 +240,10 @@ private void SettingsNavButton_Click(object sender, EventArgs e)
237240 private void ManagersNavButton_Click ( object sender , EventArgs e )
238241 => NavigateTo ( PageType . Managers ) ;
239242
243+ private bool _lastNavItemSelectionWasAuto ;
240244 private void SelectNavButtonForPage ( PageType page )
241245 {
246+ _lastNavItemSelectionWasAuto = true ;
242247 NavView . SelectedItem = page switch
243248 {
244249 PageType . Discover => DiscoverNavBtn ,
@@ -249,6 +254,7 @@ private void SelectNavButtonForPage(PageType page)
249254 PageType . Managers => ManagersNavBtn ,
250255 _ => MoreNavBtn ,
251256 } ;
257+ _lastNavItemSelectionWasAuto = false ;
252258 }
253259
254260 private async void AboutNavButton_Click ( object sender , RoutedEventArgs e )
@@ -258,26 +264,47 @@ private async void AboutNavButton_Click(object sender, RoutedEventArgs e)
258264 SelectNavButtonForPage ( CurrentPage_t ) ;
259265 }
260266
261- public void NavigateTo ( PageType NewPage_t )
267+ public void NavigateTo ( PageType NewPage_t , bool toHistory = true )
262268 {
263269 SelectNavButtonForPage ( NewPage_t ) ;
264- if ( CurrentPage_t == NewPage_t ) return ;
270+ if ( CurrentPage_t == NewPage_t )
271+ return ;
265272
266273 Page NewPage = GetPageForType ( NewPage_t ) ;
267-
268274 Page ? oldPage = ContentFrame . Content as Page ;
269275 ContentFrame . Content = NewPage ;
270276
271277 OldPage_t = CurrentPage_t ;
272278 CurrentPage_t = NewPage_t ;
273279
274280 ( oldPage as IEnterLeaveListener ) ? . OnLeave ( ) ;
281+ if ( toHistory && OldPage_t is not PageType . Null )
282+ {
283+ NavigationHistory . Add ( OldPage_t ) ;
284+ CanGoBackChanged ? . Invoke ( this , true ) ;
285+ }
275286
276287 ( NewPage as AbstractPackagesPage ) ? . FocusPackageList ( ) ;
277288 ( NewPage as AbstractPackagesPage ) ? . FilterPackages ( ) ;
278289 ( NewPage as IEnterLeaveListener ) ? . OnEnter ( ) ;
279290 }
280291
292+ public void NavigateBack ( )
293+ {
294+ if ( ContentFrame . Content is IInnerNavigationPage navPage && navPage . CanGoBack ( ) )
295+ {
296+ navPage . GoBack ( ) ;
297+ }
298+ else
299+ {
300+ NavigateTo ( NavigationHistory . Last ( ) , toHistory : false ) ;
301+ NavigationHistory . RemoveAt ( NavigationHistory . Count - 1 ) ;
302+ CanGoBackChanged ? . Invoke (
303+ this ,
304+ NavigationHistory . Any ( ) || ( ( ContentFrame . Content as IInnerNavigationPage ) ? . CanGoBack ( ) ?? false ) ) ;
305+ }
306+ }
307+
281308 private void ReleaseNotesMenu_Click ( object sender , RoutedEventArgs e )
282309 => DialogHelper . ShowReleaseNotes ( ) ;
283310
@@ -414,15 +441,12 @@ private void ClearSuccessfulOps_Click(object sender, RoutedEventArgs e)
414441
415442 private void NavigationView_SelectionChanged ( NavigationView sender , NavigationViewSelectionChangedEventArgs args )
416443 {
417- if ( args . SelectedItem is CustomNavViewItem item )
444+ if ( _lastNavItemSelectionWasAuto )
445+ return ;
446+
447+ if ( args . SelectedItem is CustomNavViewItem item && item . Tag is not PageType . Null )
418448 {
419- if ( item . Tag is PageType . Null )
420- {
421- }
422- else
423- {
424- NavigateTo ( item . Tag ) ;
425- }
449+ NavigateTo ( item . Tag ) ;
426450 }
427451 }
428452
0 commit comments