diff --git a/src/Lemon.ModuleNavigation.Avaloniaui/Core/NavigationExtension.cs b/src/Lemon.ModuleNavigation.Avaloniaui/Core/NavigationExtension.cs index 06b1900..941e2e5 100644 --- a/src/Lemon.ModuleNavigation.Avaloniaui/Core/NavigationExtension.cs +++ b/src/Lemon.ModuleNavigation.Avaloniaui/Core/NavigationExtension.cs @@ -213,7 +213,7 @@ private static void SetBinding(Control control, { return null; } - return navigationHandler.ModuleManager.CreateView(m) as Control; + return navigationHandler.ModuleManager.GetOrCreateView(m, regionName) as Control; }); } else if (control is ItemsControl itemsControl) @@ -248,7 +248,7 @@ private static void SetBinding(Control control, { return null; } - return navigationHandler.ModuleManager.CreateView(m) as Control; + return navigationHandler.ModuleManager.GetOrCreateView(m, regionName) as Control; }); } else if (control is ContentControl contentControl) diff --git a/src/Lemon.ModuleNavigation/Abstracts/IModule.cs b/src/Lemon.ModuleNavigation/Abstracts/IModule.cs index 7bef6e6..188a726 100644 --- a/src/Lemon.ModuleNavigation/Abstracts/IModule.cs +++ b/src/Lemon.ModuleNavigation/Abstracts/IModule.cs @@ -39,6 +39,14 @@ public Type ViewModelType { get; } + public IView? View + { + get; + } + public IModuleNavigationAware? ViewModel + { + get; + } public void Initialize(); } } diff --git a/src/Lemon.ModuleNavigation/Core/ModuleManager.cs b/src/Lemon.ModuleNavigation/Core/ModuleManager.cs index 431cf73..52cc475 100644 --- a/src/Lemon.ModuleNavigation/Core/ModuleManager.cs +++ b/src/Lemon.ModuleNavigation/Core/ModuleManager.cs @@ -1,6 +1,5 @@ using Lemon.ModuleNavigation.Abstracts; using Microsoft.Extensions.DependencyInjection; -using System; using System.Collections.Concurrent; using System.Collections.ObjectModel; using System.ComponentModel; @@ -11,11 +10,15 @@ namespace Lemon.ModuleNavigation.Core public class ModuleManager : IModuleManager, INotifyPropertyChanged { private readonly ConcurrentDictionary _modulesCache; - private readonly ConcurrentDictionary<(string, string), IView> _regionCache; + private readonly ConcurrentDictionary<(string RegionName, string ModuleKey), IView> _regionCache; private readonly IServiceProvider _serviceProvider; - public ModuleManager(IEnumerable modules, IServiceProvider serviceProvider) + private readonly IRegionManager _regionManager; + public ModuleManager(IEnumerable modules, + IRegionManager regionManager, + IServiceProvider serviceProvider) { _serviceProvider = serviceProvider; + _regionManager = regionManager; _regionCache = []; _modulesCache = new ConcurrentDictionary(modules.ToDictionary(m => m.Key, m => m)); Modules = _modulesCache.Values; @@ -85,7 +88,6 @@ public void RequestNavigate(IModule module, NavigationParameters parameters) ActiveModules.Add(module); } } - ///TODO:Consider an async implementation module.Initialize(); module.IsActivated = true; @@ -111,10 +113,30 @@ public IView GetOrCreateView(IModule module, string regionName) } else { - var view = CreateView(module); + IView view; + if (!IsRenderedOnAnyRegion(module.Key)) + { + view = module.View!; + } + else + { + view = CreateView(module); + } _regionCache.TryAdd((regionName, module.Key), view); return view; } } + + private bool IsRenderedOnAnyRegion(string moduleKey) + { + if (!_regionCache.IsEmpty) + { + foreach (var item in _regionCache) + { + return (item.Key.ModuleKey == moduleKey); + } + } + return false; + } } }