diff --git a/Directory.Build.props b/Directory.Build.props
index 9d5af4701a..0f7e91aa2e 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -24,7 +24,7 @@ https://docs.microsoft.com/en-us/windows/win32/fileio/maximum-file-path-limitati
SourceGen
- 10.0.41
+ 10.0.51
true
true
true
diff --git a/samples/CommunityToolkit.Maui.Sample/Pages/Views/Popup/PopupsPage.xaml.cs b/samples/CommunityToolkit.Maui.Sample/Pages/Views/Popup/PopupsPage.xaml.cs
index 076ef8e8b5..9bc18a4cd2 100644
--- a/samples/CommunityToolkit.Maui.Sample/Pages/Views/Popup/PopupsPage.xaml.cs
+++ b/samples/CommunityToolkit.Maui.Sample/Pages/Views/Popup/PopupsPage.xaml.cs
@@ -33,6 +33,15 @@ protected override async void OnNavigatedFrom(NavigatedFromEventArgs args)
{
base.OnNavigatedFrom(args);
if (args.IsDestinationPageACommunityToolkitPopupPage())
+ {
+ await Toast.Make("Popup Opened").Show();
+ }
+ }
+
+ protected override async void OnNavigatingFrom(NavigatingFromEventArgs args)
+ {
+ base.OnNavigatingFrom(args);
+ if (args.IsDestinationPageACommunityToolkitPopupPage())
{
await Toast.Make("Opening Popup").Show();
}
diff --git a/src/CommunityToolkit.Maui.UnitTests/Extensions/NavigatedFromEventArgsExtensionsTests.cs b/src/CommunityToolkit.Maui.UnitTests/Extensions/NavigatedFromEventArgsExtensionsTests.cs
index 61b83d5f5a..704bbe178f 100644
--- a/src/CommunityToolkit.Maui.UnitTests/Extensions/NavigatedFromEventArgsExtensionsTests.cs
+++ b/src/CommunityToolkit.Maui.UnitTests/Extensions/NavigatedFromEventArgsExtensionsTests.cs
@@ -7,7 +7,7 @@ namespace CommunityToolkit.Maui.UnitTests.Extensions;
public class NavigatedFromEventArgsExtensionsTests : BaseViewTest
{
- [Fact]
+ [Fact(Timeout = (int)TestDuration.Medium)]
public async Task NavigatedFromEventArgsExtensions_IsDestinationPageACommunityToolkitPopupPage_ShouldReturnTrue()
{
// Arrange
@@ -36,11 +36,12 @@ public async Task NavigatedFromEventArgsExtensions_IsDestinationPageACommunityTo
void HandleNavigatedFromEventArgsReceived(object? sender, NavigatedFromEventArgs e)
{
+ shellContentPage.NavigatedFromEventArgsReceived -= HandleNavigatedFromEventArgsReceived;
isDestinationPageACommunityToolkitPopupPageTCS.SetResult(e.IsDestinationPageACommunityToolkitPopupPage());
}
}
- [Fact]
+ [Fact(Timeout = (int)TestDuration.Medium)]
public async Task NavigatedFromEventArgsExtensions_IsDestinationPageACommunityToolkitPopupPage_ShouldReturnFalse()
{
// Arrange
diff --git a/src/CommunityToolkit.Maui.UnitTests/Extensions/NavigatedToEventArgsExtensionsTests.cs b/src/CommunityToolkit.Maui.UnitTests/Extensions/NavigatedToEventArgsExtensionsTests.cs
index dcdc34a086..c464c746c4 100644
--- a/src/CommunityToolkit.Maui.UnitTests/Extensions/NavigatedToEventArgsExtensionsTests.cs
+++ b/src/CommunityToolkit.Maui.UnitTests/Extensions/NavigatedToEventArgsExtensionsTests.cs
@@ -7,7 +7,7 @@ namespace CommunityToolkit.Maui.UnitTests.Extensions;
public class NavigatedToEventArgsExtensionsTests : BaseViewTest
{
- [Fact]
+ [Fact(Timeout = (int)TestDuration.Medium)]
public async Task NavigatedToEventArgsExtensions_WasPreviousPageACommunityToolkitPopupPage_ShouldReturnTrue()
{
// Arrange
@@ -38,12 +38,13 @@ void HandleNavigatedToEventArgsReceived(object? sender, NavigatedToEventArgs e)
{
if (e.PreviousPage != mainPage)
{
+ shellContentPage.NavigatedToEventArgsReceived -= HandleNavigatedToEventArgsReceived;
wasPreviousPageACommunityToolkitPopupPageTCS.SetResult(e.WasPreviousPageACommunityToolkitPopupPage());
}
}
}
- [Fact]
+ [Fact(Timeout = (int)TestDuration.Medium)]
public async Task NavigatedToEventArgsExtensions_WasPreviousPageACommunityToolkitPopupPage_ShouldReturnFalse()
{
// Arrange
diff --git a/src/CommunityToolkit.Maui.UnitTests/Extensions/NavigatingFromEventArgsExtensionsTests.cs b/src/CommunityToolkit.Maui.UnitTests/Extensions/NavigatingFromEventArgsExtensionsTests.cs
new file mode 100644
index 0000000000..5cb74bad37
--- /dev/null
+++ b/src/CommunityToolkit.Maui.UnitTests/Extensions/NavigatingFromEventArgsExtensionsTests.cs
@@ -0,0 +1,89 @@
+using CommunityToolkit.Maui.Extensions;
+using CommunityToolkit.Maui.UnitTests.Mocks;
+using Xunit;
+
+namespace CommunityToolkit.Maui.UnitTests.Extensions;
+
+public class NavigatingFromEventArgsExtensionsTests : BaseViewTest
+{
+ [Fact(Timeout = (int)TestDuration.Medium)]
+ public async Task NavigatingFromEventArgsExtensions_IsDestinationPageACommunityToolkitPopupPage_ShouldReturnTrue()
+ {
+ // Arrange
+ TaskCompletionSource isDestinationPageACommunityToolkitPopupPageTCS = new();
+ var application = (MockApplication)ServiceProvider.GetRequiredService();
+ var popupService = ServiceProvider.GetRequiredService();
+
+ var shell = (Shell)(application.Windows[0].Page ?? throw new InvalidOperationException("Unable to retrieve Shell"));
+ var mainPage = shell.CurrentPage;
+ var shellContentPage = new ShellContentPage();
+ shellContentPage.NavigatingFromEventArgsReceived += HandleNavigatingFromEventArgsReceived;
+
+ var shellParameters = new Dictionary
+ {
+ { nameof(ContentPage.BackgroundColor), Colors.Orange }
+ };
+
+ // Act
+ await mainPage.Navigation.PushAsync(shellContentPage);
+ await popupService.ShowPopupAsync(shell, null, shellParameters, TestContext.Current.CancellationToken);
+ bool? isDestinationPageACommunityToolkitPopupPage = await isDestinationPageACommunityToolkitPopupPageTCS.Task;
+
+ // Assert
+ Assert.True(isDestinationPageACommunityToolkitPopupPage);
+
+ void HandleNavigatingFromEventArgsReceived(object? sender, NavigatingFromEventArgs e)
+ {
+ ArgumentNullException.ThrowIfNull(sender);
+
+ if (sender is not ShellContentPage)
+ {
+ shellContentPage.NavigatingFromEventArgsReceived -= HandleNavigatingFromEventArgsReceived;
+ isDestinationPageACommunityToolkitPopupPageTCS.SetResult(e.IsDestinationPageACommunityToolkitPopupPage());
+ }
+ }
+ }
+
+ [Fact(Timeout = (int)TestDuration.Medium)]
+ public async Task NavigatingFromEventArgsExtensions_IsDestinationPageACommunityToolkitPopupPage_ShouldReturnFalse()
+ {
+ // Arrange
+ MockApplication application = (MockApplication)ServiceProvider.GetRequiredService();
+
+ Shell shell = (Shell)(application.Windows[0].Page ?? throw new InvalidOperationException("Unable to retrieve Shell"));
+ Page mainPage = shell.CurrentPage;
+
+ ShellContentPage shellContentPage = new();
+ ShellContentPage anotherShellContentPage = new();
+
+ TaskCompletionSource isDestinationPageACommunityToolkitPopupPageTCS = new();
+ shellContentPage.NavigatingFromEventArgsReceived += HandleNavigatingFromEventArgsReceived;
+
+ // Act
+ await mainPage.Navigation.PushAsync(shellContentPage);
+ await mainPage.Navigation.PushAsync(anotherShellContentPage);
+ bool? isDestinationPageACommunityToolkitPopupPage = await isDestinationPageACommunityToolkitPopupPageTCS.Task;
+
+ // Assert
+ Assert.False(isDestinationPageACommunityToolkitPopupPage);
+
+ void HandleNavigatingFromEventArgsReceived(object? sender, NavigatingFromEventArgs e)
+ {
+ ArgumentNullException.ThrowIfNull(sender);
+
+ shellContentPage.NavigatingFromEventArgsReceived -= HandleNavigatingFromEventArgsReceived;
+ isDestinationPageACommunityToolkitPopupPageTCS.SetResult(e.IsDestinationPageACommunityToolkitPopupPage());
+ }
+ }
+
+ sealed class ShellContentPage : ContentPage
+ {
+ public event EventHandler? NavigatingFromEventArgsReceived;
+
+ protected override void OnNavigatingFrom(NavigatingFromEventArgs args)
+ {
+ base.OnNavigatingFrom(args);
+ NavigatingFromEventArgsReceived?.Invoke(this, args);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/CommunityToolkit.Maui/Extensions/NavigatedFromEventArgsExtensions.shared.cs b/src/CommunityToolkit.Maui/Extensions/NavigatedFromEventArgsExtensions.shared.cs
deleted file mode 100644
index 174cadc492..0000000000
--- a/src/CommunityToolkit.Maui/Extensions/NavigatedFromEventArgsExtensions.shared.cs
+++ /dev/null
@@ -1,16 +0,0 @@
-using CommunityToolkit.Maui.Views;
-
-namespace CommunityToolkit.Maui.Extensions;
-
-///
-/// Extension methods for .
-///
-public static class NavigatedFromEventArgsExtensions
-{
- ///
- /// Determines whether the previous page was a Community Toolkit .
- ///
- /// The current .
- /// A boolean indicating whether the previous page was a Community Toolkit .
- public static bool IsDestinationPageACommunityToolkitPopupPage(this NavigatedFromEventArgs args) => args.DestinationPage is PopupPage;
-}
\ No newline at end of file
diff --git a/src/CommunityToolkit.Maui/Extensions/NavigatedToEventArgsExtensions.shared.cs b/src/CommunityToolkit.Maui/Extensions/NavigatedToEventArgsExtensions.shared.cs
deleted file mode 100644
index 961bed55a2..0000000000
--- a/src/CommunityToolkit.Maui/Extensions/NavigatedToEventArgsExtensions.shared.cs
+++ /dev/null
@@ -1,16 +0,0 @@
-using CommunityToolkit.Maui.Views;
-
-namespace CommunityToolkit.Maui.Extensions;
-
-///
-/// Extension methods for .
-///
-public static class NavigatedToEventArgsExtensions
-{
- ///
- /// Determines whether the previous page was a Community Toolkit .
- ///
- /// The current .
- /// A boolean indicating whether the previous page was a Community Toolkit .
- public static bool WasPreviousPageACommunityToolkitPopupPage(this NavigatedToEventArgs args) => args.PreviousPage is PopupPage;
-}
\ No newline at end of file
diff --git a/src/CommunityToolkit.Maui/Extensions/NavigationEventArgsExtensions.cs b/src/CommunityToolkit.Maui/Extensions/NavigationEventArgsExtensions.cs
new file mode 100644
index 0000000000..de1d9fcfd4
--- /dev/null
+++ b/src/CommunityToolkit.Maui/Extensions/NavigationEventArgsExtensions.cs
@@ -0,0 +1,30 @@
+using CommunityToolkit.Maui.Views;
+
+namespace CommunityToolkit.Maui.Extensions;
+
+///
+/// Extension methods for , and .
+///
+public static class NavigationEventArgsExtensions
+{
+ ///
+ /// Determines if the destination page is the internal wrapper used when displaying a Community Toolkit .
+ ///
+ /// The current .
+ /// A boolean indicating if the destination page is a representing a Community Toolkit .
+ public static bool IsDestinationPageACommunityToolkitPopupPage(this NavigatedFromEventArgs args) => args.DestinationPage is PopupPage;
+
+ ///
+ /// Determines whether the previous page was the internal wrapper used when displaying a Community Toolkit .
+ ///
+ /// The current .
+ /// A boolean indicating whether the previous page was a representing a Community Toolkit .
+ public static bool WasPreviousPageACommunityToolkitPopupPage(this NavigatedToEventArgs args) => args.PreviousPage is PopupPage;
+
+ ///
+ /// Determines if the destination page will be the internal wrapper used when displaying a Community Toolkit .
+ ///
+ /// The current .
+ /// A boolean indicating if the destination page will be a representing a Community Toolkit .
+ public static bool IsDestinationPageACommunityToolkitPopupPage(this NavigatingFromEventArgs args) => args.DestinationPage is PopupPage;
+}
\ No newline at end of file