From b8e50e4dc0fee58d763261e70f92f73555582d11 Mon Sep 17 00:00:00 2001 From: Daniel Clark Date: Wed, 21 Dec 2022 10:12:54 +0000 Subject: [PATCH] Fixed issue with dialog opening but is not closing due to request running into a "ContentControlHandler" after the dialog's await state has been completed. --- Framework/Avalonia/Avalonia.csproj | 1 + .../Avalonia/Markups/NavigateExtension.cs | 4 ++-- .../ContentControlNavigationHandler.cs | 6 +++--- .../ContentDialogNavigationHandler.cs | 10 ++++++---- .../Navigation/FrameNavigationHandler.cs | 6 +++--- .../Avalonia/Navigation/NavigateHandler.cs | 18 ++++++++---------- Framework/Avalonia/Navigation/Navigation.cs | 2 +- .../Lifecycles/RequestClassHandlerWrapper.cs | 2 +- 8 files changed, 25 insertions(+), 24 deletions(-) diff --git a/Framework/Avalonia/Avalonia.csproj b/Framework/Avalonia/Avalonia.csproj index 8c89d88..e79bdca 100644 --- a/Framework/Avalonia/Avalonia.csproj +++ b/Framework/Avalonia/Avalonia.csproj @@ -11,6 +11,7 @@ + \ No newline at end of file diff --git a/Framework/Avalonia/Markups/NavigateExtension.cs b/Framework/Avalonia/Markups/NavigateExtension.cs index 5911911..a9182f7 100644 --- a/Framework/Avalonia/Markups/NavigateExtension.cs +++ b/Framework/Avalonia/Markups/NavigateExtension.cs @@ -463,12 +463,12 @@ public class NavigateExtension : TriggerExtension name = string.Format(format, name); } - mediator.Send(new Navigate(name, parameters.ToArray()) { Route = route }); + mediator.Send(new Navigate(name, parameters.ToArray()) { Route = route }).ConfigureAwait(false); } if (to is Type type) { - mediator.Send(new Navigate(type, parameters.ToArray()) { Route = route }); + mediator.Send(new Navigate(type, parameters.ToArray()) { Route = route }).ConfigureAwait(false); } } } diff --git a/Framework/Avalonia/Navigation/ContentControlNavigationHandler.cs b/Framework/Avalonia/Navigation/ContentControlNavigationHandler.cs index abbcde1..cd72723 100644 --- a/Framework/Avalonia/Navigation/ContentControlNavigationHandler.cs +++ b/Framework/Avalonia/Navigation/ContentControlNavigationHandler.cs @@ -3,9 +3,9 @@ using Toolkit.Framework.Foundation; namespace Toolkit.Framework.Avalonia; -public class ContentControlNavigationHandler : IRequestHandler +public class ContentControlNavigationHandler : IRequestHandler { - public ValueTask Handle(ContentControlNavigation request, CancellationToken cancellationToken) + public ValueTask Handle(ContentControlNavigation request, CancellationToken cancellationToken) { if (request.Template is TemplatedControl control) { @@ -13,6 +13,6 @@ public class ContentControlNavigationHandler : IRequestHandler(true); + return default; } } \ No newline at end of file diff --git a/Framework/Avalonia/Navigation/ContentDialogNavigationHandler.cs b/Framework/Avalonia/Navigation/ContentDialogNavigationHandler.cs index 0da3122..d4bbed2 100644 --- a/Framework/Avalonia/Navigation/ContentDialogNavigationHandler.cs +++ b/Framework/Avalonia/Navigation/ContentDialogNavigationHandler.cs @@ -1,11 +1,12 @@ using FluentAvalonia.UI.Controls; +using System.Diagnostics; using Toolkit.Framework.Foundation; namespace Toolkit.Framework.Avalonia; -public class ContentDialogNavigationHandler : IRequestHandler +public class ContentDialogNavigationHandler : IRequestHandler { - public async ValueTask Handle(ContentDialogNavigation request, CancellationToken cancellationToken) + public ValueTask Handle(ContentDialogNavigation request, CancellationToken cancellationToken) { if (request.Template is ContentDialog contentDialog) { @@ -35,9 +36,10 @@ public class ContentDialogNavigationHandler : IRequestHandler +public class FrameNavigationHandler : IRequestHandler { - public async ValueTask Handle(FrameNavigation request, CancellationToken cancellationToken) + public ValueTask Handle(FrameNavigation request, CancellationToken cancellationToken) { request.Route.NavigationPageFactory = new NavigationPageFactory(); @@ -27,6 +27,6 @@ public class FrameNavigationHandler : IRequestHandler request.Route.NavigateFromObject(content); } - return await completionSource.Task; + return default; } } \ No newline at end of file diff --git a/Framework/Avalonia/Navigation/NavigateHandler.cs b/Framework/Avalonia/Navigation/NavigateHandler.cs index f5bb795..f27a3ad 100644 --- a/Framework/Avalonia/Navigation/NavigateHandler.cs +++ b/Framework/Avalonia/Navigation/NavigateHandler.cs @@ -1,5 +1,6 @@ using Avalonia.Controls; -using FluentAvalonia.UI.Controls; +using System.Diagnostics; +using Toolkit.Controls.Avalonia; using Toolkit.Framework.Foundation; namespace Toolkit.Framework.Avalonia; @@ -28,7 +29,7 @@ public class NavigateHandler : IRequestHandler this.descriptors = descriptors; } - public async ValueTask Handle(Navigate request, CancellationToken cancellationToken) + public ValueTask Handle(Navigate request, CancellationToken cancellationToken) { object? content = null; object? template = null; @@ -75,20 +76,17 @@ public class NavigateHandler : IRequestHandler target = template; } - bool hasNavigated = false; if (target is Frame frame) { - hasNavigated = await mediator.Send(new FrameNavigation(frame, content, template, keyedParameters)); + mediator.Send(new FrameNavigation(frame, content, template, keyedParameters)); } - - if (target is ContentDialog dialog) + else if (target is ContentDialog dialog) { - hasNavigated = await mediator.Send(new ContentDialogNavigation(dialog, content, template, keyedParameters)); + mediator.Send(new ContentDialogNavigation(dialog, content, template, keyedParameters)); } - - if (target is ContentControl contentControl) + else if (target is ContentControl contentControl) { - hasNavigated = await mediator.Send(new ContentControlNavigation(contentControl, content, template, keyedParameters)); + mediator.Send(new ContentControlNavigation(contentControl, content, template, keyedParameters)); } } else diff --git a/Framework/Avalonia/Navigation/Navigation.cs b/Framework/Avalonia/Navigation/Navigation.cs index 9728abb..4a86937 100644 --- a/Framework/Avalonia/Navigation/Navigation.cs +++ b/Framework/Avalonia/Navigation/Navigation.cs @@ -3,7 +3,7 @@ using Toolkit.Framework.Foundation; namespace Toolkit.Framework.Avalonia; -public record Navigation : IRequest where TRoute : TemplatedControl +public record Navigation : IRequest where TRoute : TemplatedControl { public TRoute Route { get; } diff --git a/Framework/Foundation/Lifecycles/RequestClassHandlerWrapper.cs b/Framework/Foundation/Lifecycles/RequestClassHandlerWrapper.cs index 538033d..cbcd98c 100644 --- a/Framework/Foundation/Lifecycles/RequestClassHandlerWrapper.cs +++ b/Framework/Foundation/Lifecycles/RequestClassHandlerWrapper.cs @@ -8,7 +8,7 @@ public class RequestClassHandlerWrapper where TRequest : cl IEnumerable> pipelineBehaviours) { MessageHandlerDelegate handler = concreteHandler.Handle; - foreach (var pipeline in pipelineBehaviours.Reverse()) + foreach (IPipelineBehavior? pipeline in pipelineBehaviours.Reverse()) { MessageHandlerDelegate handlerCopy = handler; IPipelineBehavior pipelineCopy = pipeline;