diff --git a/src/Uno.Extensions.Navigation.Toolkit/ApplicationBuilderExtensions.cs b/src/Uno.Extensions.Navigation.Toolkit/ApplicationBuilderExtensions.cs index 826ee654e5..065f8b573c 100644 --- a/src/Uno.Extensions.Navigation.Toolkit/ApplicationBuilderExtensions.cs +++ b/src/Uno.Extensions.Navigation.Toolkit/ApplicationBuilderExtensions.cs @@ -6,9 +6,9 @@ private struct ToolkitViewInitializer : IRootViewInitializer { public ContentControl CreateDefaultView() => new LoadingView(); - public void InitializeViewHost(Window window, FrameworkElement element, Task loadingTask) + public void InitializeViewHost(Window window, FrameworkElement element, Task loadingTask, bool doNotActivate) { - window.ApplyLoadingTask(element, loadingTask); + window.ApplyLoadingTask(element, loadingTask, doNotActivate); } public void PreInitialize(FrameworkElement element, IApplicationBuilder builder) diff --git a/src/Uno.Extensions.Navigation.Toolkit/WindowExtensions.cs b/src/Uno.Extensions.Navigation.Toolkit/WindowExtensions.cs index 273c2746ab..80db79ed17 100644 --- a/src/Uno.Extensions.Navigation.Toolkit/WindowExtensions.cs +++ b/src/Uno.Extensions.Navigation.Toolkit/WindowExtensions.cs @@ -16,6 +16,7 @@ public static class WindowExtensions /// [optional] Initial navigation view /// [optional] Initial navigation viewmodel /// [optional] Callback to drive initial navigation for app + /// [optional] Do not activate the window after initializing navigation /// The created IHost public static Task InitializeNavigationAsync( this Window window, @@ -24,18 +25,20 @@ public static Task InitializeNavigationAsync( string? initialRoute = "", Type? initialView = null, Type? initialViewModel = null, - Func? initialNavigate = null) + Func? initialNavigate = null, + bool doNotActivate = false) { return window.InternalInitializeNavigationAsync( buildHost, navigationRoot, initialRoute, initialView, initialViewModel, ApplyLoadingTask, - initialNavigate + initialNavigate, + doNotActivate ); } - internal static void ApplyLoadingTask(this Window window, FrameworkElement root, Task navInit) + internal static void ApplyLoadingTask(this Window window, FrameworkElement root, Task navInit, bool doNotActivate) { var activate = true; if (root is LoadingView lv) @@ -53,7 +56,8 @@ internal static void ApplyLoadingTask(this Window window, FrameworkElement root, loadingTask = new Func(async () => { await navInit; - window.Activate(); + if (!doNotActivate) + window.Activate(); })(); } } @@ -61,7 +65,7 @@ internal static void ApplyLoadingTask(this Window window, FrameworkElement root, lv.Source = loading; } - if (activate) + if (activate && !doNotActivate) { // Activate immediately to show the splash screen window.Activate(); diff --git a/src/Uno.Extensions.Navigation.UI/ApplicationBuilderExtensions.cs b/src/Uno.Extensions.Navigation.UI/ApplicationBuilderExtensions.cs index 18b0845cc1..2d02e78e32 100644 --- a/src/Uno.Extensions.Navigation.UI/ApplicationBuilderExtensions.cs +++ b/src/Uno.Extensions.Navigation.UI/ApplicationBuilderExtensions.cs @@ -9,9 +9,10 @@ public static class ApplicationBuilderExtensions /// The to use for the App Shell. /// The . /// An optional Navigation Delegate to conditionally control where the app should navigate on launch. + /// An optional flag to prevent the Window from activating right after initialization but only when host is completely loaded. /// The . public static async Task NavigateAsync(this IApplicationBuilder appBuilder, - Func? initialNavigate = null) + Func? initialNavigate = null, bool doNotActivate = false) where TShell : UIElement, new() { var appRoot = new TShell(); @@ -21,7 +22,7 @@ public static async Task NavigateAsync(this IApplicationBuilder a navRoot = contentProvider.ContentControl; } - Action initializeViewHost = (_, _, _) => { }; + Action initializeViewHost = (_, _, _, _) => { }; if (appBuilder.Properties.TryGetValue(typeof(IRootViewInitializer), out var propValue) && propValue is IRootViewInitializer initializer) { navRoot ??= initializer.CreateDefaultView(); @@ -43,7 +44,8 @@ public static async Task NavigateAsync(this IApplicationBuilder a buildHost: () => Task.FromResult(appBuilder.Build()), navigationRoot: navRoot, initializeViewHost: initializeViewHost, - initialNavigate: initialNavigate + initialNavigate: initialNavigate, + doNotActivate: doNotActivate ); } } diff --git a/src/Uno.Extensions.Navigation.UI/IRootViewInitializer.cs b/src/Uno.Extensions.Navigation.UI/IRootViewInitializer.cs index 4ad9ee0f94..f0488b5c1b 100644 --- a/src/Uno.Extensions.Navigation.UI/IRootViewInitializer.cs +++ b/src/Uno.Extensions.Navigation.UI/IRootViewInitializer.cs @@ -22,5 +22,6 @@ internal interface IRootViewInitializer /// /// /// - void InitializeViewHost(Window window, FrameworkElement element, Task loadingTask); + /// + void InitializeViewHost(Window window, FrameworkElement element, Task loadingTask, bool doNotActivate = false); } diff --git a/src/Uno.Extensions.Navigation.UI/ServiceProviderExtensions.cs b/src/Uno.Extensions.Navigation.UI/ServiceProviderExtensions.cs index 0e739d9efc..de80eb8051 100644 --- a/src/Uno.Extensions.Navigation.UI/ServiceProviderExtensions.cs +++ b/src/Uno.Extensions.Navigation.UI/ServiceProviderExtensions.cs @@ -46,7 +46,7 @@ internal static IServiceProvider CreateNavigationScope(this IServiceProvider ser .CloneScopedInstance(services); } - + /// /// Initializes navigation for an application using a ContentControl @@ -91,8 +91,9 @@ internal static Task InternalInitializeNavigationAsync( string? initialRoute = "", Type? initialView = null, Type? initialViewModel = null, - Action? initializeViewHost = null, - Func? initialNavigate = null) + Action? initializeViewHost = null, + Func? initialNavigate = null, + bool doNotActivate = false) { if (window.Content is null) { @@ -100,7 +101,7 @@ internal static Task InternalInitializeNavigationAsync( } var buildTask = window.BuildAndInitializeHostAsync(navigationRoot, buildHost, initialRoute, initialView, initialViewModel, initialNavigate); - initializeViewHost?.Invoke(window, navigationRoot, buildTask); + initializeViewHost?.Invoke(window, navigationRoot, buildTask, doNotActivate); return buildTask; } @@ -124,8 +125,9 @@ private static async Task BuildAndInitializeHostAsync( await startup; - // Fallback to make sure the window is activated - window.Activate(); + var hostLifetime = host.Services.GetRequiredService(); + // Activate the window after the application has started + hostLifetime.ApplicationStarted.Register(() => window.Activate()); return host; }