diff --git a/src/Wpf.Ui/Controls/NavigationView/NavigationViewContentPresenter.cs b/src/Wpf.Ui/Controls/NavigationView/NavigationViewContentPresenter.cs index a0a3a34e8..66817641e 100644 --- a/src/Wpf.Ui/Controls/NavigationView/NavigationViewContentPresenter.cs +++ b/src/Wpf.Ui/Controls/NavigationView/NavigationViewContentPresenter.cs @@ -184,33 +184,42 @@ private void ApplyTransitionEffectToNavigatedPage(object content) private static void NotifyContentAboutNavigatingTo(object content) { - switch (content) - { - case INavigationAware navigationAwareNavigationContent: - _ = Task.Run(navigationAwareNavigationContent.OnNavigatedToAsync).ConfigureAwait(false); - break; - case INavigableView { ViewModel: INavigationAware navigationAwareNavigableViewViewModel }: - _ = Task.Run(navigationAwareNavigableViewViewModel.OnNavigatedToAsync).ConfigureAwait(false); - break; - case FrameworkElement { DataContext: INavigationAware navigationAwareCurrentContent }: - _ = Task.Run(navigationAwareCurrentContent.OnNavigatedToAsync).ConfigureAwait(false); - break; - } + NotifyContentAboutNavigating(content, navigationAware => navigationAware.OnNavigatedToAsync()); } private static void NotifyContentAboutNavigatingFrom(object content) + { + NotifyContentAboutNavigating(content, navigationAware => navigationAware.OnNavigatedFromAsync()); + } + + [System.Diagnostics.CodeAnalysis.SuppressMessage( + "ReSharper", + "SuspiciousTypeConversion.Global", + Justification = "The library user might make a class inherit from both FrameworkElement and INavigationAware at the same time." + )] + private static void NotifyContentAboutNavigating(object content, Func function) { switch (content) { + // The order in which the OnNavigatedToAsync/OnNavigatedFromAsync methods of View and ViewModel are called + // is not guaranteed case INavigationAware navigationAwareNavigationContent: - _ = Task.Run(navigationAwareNavigationContent.OnNavigatedFromAsync).ConfigureAwait(false); + _ = Task.Run(() => function(navigationAwareNavigationContent)).ConfigureAwait(false); + if ( + navigationAwareNavigationContent + is FrameworkElement { DataContext: INavigationAware viewModel } + && !ReferenceEquals(viewModel, navigationAwareNavigationContent) + ) + { + _ = Task.Run(() => function(viewModel)).ConfigureAwait(false); + } + break; case INavigableView { ViewModel: INavigationAware navigationAwareNavigableViewViewModel }: - _ = Task.Run(navigationAwareNavigableViewViewModel.OnNavigatedFromAsync) - .ConfigureAwait(false); + _ = Task.Run(() => function(navigationAwareNavigableViewViewModel)).ConfigureAwait(false); break; case FrameworkElement { DataContext: INavigationAware navigationAwareCurrentContent }: - _ = Task.Run(navigationAwareCurrentContent.OnNavigatedFromAsync).ConfigureAwait(false); + _ = Task.Run(() => function(navigationAwareCurrentContent)).ConfigureAwait(false); break; } }