diff --git a/src/AvaloniaInside.Shell/AppBuilderExtensions.cs b/src/AvaloniaInside.Shell/AppBuilderExtensions.cs index 53dad2e..d7918e6 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,18 +17,37 @@ public static AppBuilder UseShell(this AppBuilder builder) => Locator.CurrentMutable.Register(); Locator.CurrentMutable.Register(); - Locator.CurrentMutable.Register(); + + if (viewLocatorFactory is null) + { + Locator.CurrentMutable.Register(); + } + Locator.CurrentMutable.Register(() => new DefaultNavigationUpdateStrategy(Locator.Current.GetService()!)); Locator.CurrentMutable.Register(() => { + 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 + ); }); }); + + 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); + } + } }