diff --git a/Toolkit.Avalonia/FrameHandler.cs b/Toolkit.Avalonia/FrameHandler.cs index 247ba92..e6c4eab 100644 --- a/Toolkit.Avalonia/FrameHandler.cs +++ b/Toolkit.Avalonia/FrameHandler.cs @@ -40,8 +40,7 @@ public class FrameHandler : await deactivated.OnDeactivated(); } - - if (content is not IBackStack) + if (content is not INavigationBackStack) { if (content is IDisposable disposable) { @@ -115,6 +114,27 @@ public class FrameHandler : NavigatedTo(control); FrameNavigationOptions navigationOptions = new(); + List postNavigateActions = []; + + void CleanUp() + { + foreach (PageStackEntry? entry in frame.BackStack) + { + if (entry.Context is Control control) + { + if (control.DataContext is object content) + { + if (content is IDisposable disposable) + { + disposable.Dispose(); + } + } + } + } + + frame.BackStack.Clear(); + } + if (args.Parameters is not null) { if (args.Parameters.TryGetValue("Transition", out object? transition)) @@ -133,18 +153,32 @@ public class FrameHandler : break; } - if (args.Parameters.TryGetValue("NavigationStackEnabled", out object? navigationStackEnabled)) + if (args.Parameters.TryGetValue("IsBackStackEnabled", out object? isBackStackEnabled)) { - if (navigationStackEnabled is bool value) + if (isBackStackEnabled is bool value) { navigationOptions.IsNavigationStackEnabled = value; } } + + if (args.Parameters.TryGetValue("ClearBackStack", out object? clearBackStack)) + { + if (clearBackStack is bool value) + { + if (value) + { + postNavigateActions.Add(() => CleanUp()); + } + } + } } } - frame.NavigateFromObject(control, navigationOptions); + foreach (Action postAction in postNavigateActions) + { + postAction.Invoke(); + } } } diff --git a/Toolkit.Foundation/IBackStack.cs b/Toolkit.Foundation/IBackStack.cs deleted file mode 100644 index 7aeb6eb..0000000 --- a/Toolkit.Foundation/IBackStack.cs +++ /dev/null @@ -1,3 +0,0 @@ -namespace Toolkit.Foundation; - -public interface IBackStack; \ No newline at end of file diff --git a/Toolkit.Foundation/INavigationBackStack.cs b/Toolkit.Foundation/INavigationBackStack.cs new file mode 100644 index 0000000..ca6c2da --- /dev/null +++ b/Toolkit.Foundation/INavigationBackStack.cs @@ -0,0 +1,3 @@ +namespace Toolkit.Foundation; + +public interface INavigationBackStack; \ No newline at end of file