Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using Microsoft.Practices.Prism.Regions;
- using System.ComponentModel.Composition;
- using Microsoft.Practices.ServiceLocation;
- using Microsoft.Practices.Prism;
- [PartCreationPolicy(CreationPolicy.Shared)]
- [Export(typeof(IRegionNavigationContentLoader))]
- public class MyRegionNavigationContentLoader : IRegionNavigationContentLoader
- private readonly IServiceLocator serviceLocator;
- [ImportingConstructor]
- public MyRegionNavigationContentLoader(IServiceLocator serviceLocator)
- {
- this.serviceLocator = serviceLocator;
- }
- public Object LoadContent(Microsoft.Practices.Prism.Regions.IRegion region, Microsoft.Practices.Prism.Regions.NavigationContext navigationContext)
- {
- if (region == null) throw new ArgumentNullException("region");
- if (navigationContext == null) throw new ArgumentNullException("navigationContext");
- string candidateTargetContract = this.GetContractFromNavigationContext(navigationContext);
- var candidates = this.GetCandidatesFromRegion(region, candidateTargetContract)
- var acceptingCandidates =
- candidates.Where(
- v =>
- {
- var navigationAware = v as INavigationAware;
- if (navigationAware != null && !navigationAware.IsNavigationTarget(navigationContext)) return false;
- var frameworkElement = v as FrameworkElement;
- if (frameworkElement == null) return true;
- navigationAware = frameworkElement.DataContext as INavigationAware;
- return navigationAware == null || navigationAware.IsNavigationTarget(navigationContext);
- });
- var view = acceptingCandidates.FirstOrDefault();
- if (view != null) return view;
- view = this.CreateNewRegionItem(candidateTargetContract);
- RegionManager.SetRegionManager((DependencyObject)view, new RegionManager());
- region.Add(view, null, true);
- return view;
- }
- protected virtual object CreateNewRegionItem(string candidateTargetContract)
- {
- object newRegionItem;
- try
- {
- newRegionItem = this.serviceLocator.GetInstance<object>(candidateTargetContract);
- }
- catch (ActivationException ex)
- {
- throw new InvalidOperationException(ex.Message);
- }
- return newRegionItem;
- }
- protected virtual string GetContractFromNavigationContext(NavigationContext navigationContext)
- {
- if (navigationContext == null) throw new ArgumentNullException("navigationContext");
- var candidateTargetContract = UriParsingHelper.GetAbsolutePath(navigationContext.Uri);
- candidateTargetContract = candidateTargetContract.TrimStart('/');
- return candidateTargetContract;
- }
- protected virtual IEnumerable<object> GetCandidatesFromRegion(IRegion region, string candidateNavigationContract)
- {
- if (region == null) throw new ArgumentNullException("region");
- return region.Views.Where(v =>
- string.Equals(v.GetType().Name, candidateNavigationContract, StringComparison.Ordinal) ||
- string.Equals(v.GetType().FullName, candidateNavigationContract, StringComparison.Ordinal));
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement