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;
}