From b37854f12f25aa84576639b4a2eecff5a671bd75 Mon Sep 17 00:00:00 2001 From: Daniel Meza Date: Sat, 8 Jun 2024 10:52:56 -0500 Subject: [PATCH 1/2] Add ability to provide a custom INavigationViewLocator so other OIC containers can be used to create views. --- .../AppBuilderExtensions.cs | 26 +++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/src/AvaloniaInside.Shell/AppBuilderExtensions.cs b/src/AvaloniaInside.Shell/AppBuilderExtensions.cs index 53dad2e..b258fab 100644 --- a/src/AvaloniaInside.Shell/AppBuilderExtensions.cs +++ b/src/AvaloniaInside.Shell/AppBuilderExtensions.cs @@ -1,3 +1,4 @@ +using System; using Avalonia; using AvaloniaInside.Shell.Presenters; using Splat; @@ -6,7 +7,7 @@ namespace AvaloniaInside.Shell; public static class AppBuilderExtensions { - public static AppBuilder UseShell(this AppBuilder builder) => + public static AppBuilder UseShell(this AppBuilder builder, Func? viewLocatorFactory = null) => builder.AfterPlatformServicesSetup(_ => { if (Locator.CurrentMutable is null) @@ -16,7 +17,16 @@ public static AppBuilder UseShell(this AppBuilder builder) => Locator.CurrentMutable.Register(); Locator.CurrentMutable.Register(); - Locator.CurrentMutable.Register(); + + if (viewLocatorFactory != null) + { + Locator.CurrentMutable.Register(viewLocatorFactory, typeof(INavigationViewLocator)); + } + else + { + Locator.CurrentMutable.Register(); + } + Locator.CurrentMutable.Register(() => new DefaultNavigationUpdateStrategy(Locator.Current.GetService()!)); @@ -30,4 +40,16 @@ public static AppBuilder UseShell(this AppBuilder builder) => Locator.Current.GetService()!); }); }); + + public static AppBuilder UseShell(this AppBuilder builder, Func viewFactory) + => builder.UseShell(() => new DelegateNavigationViewLocator(viewFactory)); + + private class DelegateNavigationViewLocator(Func viewFactory) + : INavigationViewLocator + { + public object GetView(NavigationNode navigationItem) + { + return viewFactory(navigationItem); + } + } } From 101945a1a9631940096b79f99323ad582b610d64 Mon Sep 17 00:00:00 2001 From: Daniel Meza Date: Sat, 8 Jun 2024 11:46:06 -0500 Subject: [PATCH 2/2] Invoke viewFactoryFactory inside INavigator factory --- src/AvaloniaInside.Shell/AppBuilderExtensions.cs | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/AvaloniaInside.Shell/AppBuilderExtensions.cs b/src/AvaloniaInside.Shell/AppBuilderExtensions.cs index b258fab..d7918e6 100644 --- a/src/AvaloniaInside.Shell/AppBuilderExtensions.cs +++ b/src/AvaloniaInside.Shell/AppBuilderExtensions.cs @@ -18,11 +18,7 @@ public static AppBuilder UseShell(this AppBuilder builder, Func(); Locator.CurrentMutable.Register(); - if (viewLocatorFactory != null) - { - Locator.CurrentMutable.Register(viewLocatorFactory, typeof(INavigationViewLocator)); - } - else + if (viewLocatorFactory is null) { Locator.CurrentMutable.Register(); } @@ -32,12 +28,14 @@ public static AppBuilder UseShell(this AppBuilder builder, Func(() => { + var viewLocator = viewLocatorFactory != null ? viewLocatorFactory.Invoke() : Locator.Current.GetService()!; var registrar = Locator.Current.GetService()!; return new Navigator( registrar, new RelativeNavigateStrategy(registrar), Locator.Current.GetService()!, - Locator.Current.GetService()!); + viewLocator + ); }); });