Advertisement
Wude

Prism4 Custom RegionNavigationContentLoader C#

Apr 8th, 2011
1,013
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.33 KB | None | 0 0
  1. using Microsoft.Practices.Prism.Regions;
  2. using System.ComponentModel.Composition;
  3. using Microsoft.Practices.ServiceLocation;
  4. using Microsoft.Practices.Prism;
  5.  
  6. [PartCreationPolicy(CreationPolicy.Shared)]
  7. [Export(typeof(IRegionNavigationContentLoader))]
  8. public class MyRegionNavigationContentLoader : IRegionNavigationContentLoader
  9.  
  10.     private readonly IServiceLocator serviceLocator;
  11.  
  12.     [ImportingConstructor]
  13.     public MyRegionNavigationContentLoader(IServiceLocator serviceLocator)
  14.     {
  15.         this.serviceLocator = serviceLocator;
  16.     }
  17.  
  18.     public Object LoadContent(Microsoft.Practices.Prism.Regions.IRegion region, Microsoft.Practices.Prism.Regions.NavigationContext navigationContext)
  19.     {
  20.         if (region == null) throw new ArgumentNullException("region");
  21.         if (navigationContext == null) throw new ArgumentNullException("navigationContext");
  22.  
  23.         string candidateTargetContract = this.GetContractFromNavigationContext(navigationContext);
  24.  
  25.         var candidates = this.GetCandidatesFromRegion(region, candidateTargetContract)
  26.  
  27.         var acceptingCandidates =
  28.             candidates.Where(
  29.                 v =>
  30.                 {
  31.                     var navigationAware = v as INavigationAware;
  32.                     if (navigationAware != null && !navigationAware.IsNavigationTarget(navigationContext)) return false;
  33.  
  34.                     var frameworkElement = v as FrameworkElement;
  35.                     if (frameworkElement == null) return true;
  36.  
  37.                     navigationAware = frameworkElement.DataContext as INavigationAware;
  38.                     return navigationAware == null || navigationAware.IsNavigationTarget(navigationContext);
  39.                 });
  40.  
  41.         var view = acceptingCandidates.FirstOrDefault();
  42.         if (view != null) return view;
  43.  
  44.         view = this.CreateNewRegionItem(candidateTargetContract);
  45.         RegionManager.SetRegionManager((DependencyObject)view, new RegionManager());
  46.         region.Add(view, null, true);
  47.  
  48.         return view;
  49.     }
  50.  
  51.     protected virtual object CreateNewRegionItem(string candidateTargetContract)
  52.     {
  53.         object newRegionItem;
  54.         try
  55.         {
  56.             newRegionItem = this.serviceLocator.GetInstance<object>(candidateTargetContract);
  57.         }
  58.         catch (ActivationException ex)
  59.         {
  60.             throw new InvalidOperationException(ex.Message);
  61.         }
  62.         return newRegionItem;
  63.     }
  64.  
  65.     protected virtual string GetContractFromNavigationContext(NavigationContext navigationContext)
  66.     {
  67.         if (navigationContext == null) throw new ArgumentNullException("navigationContext");
  68.  
  69.         var candidateTargetContract = UriParsingHelper.GetAbsolutePath(navigationContext.Uri);
  70.         candidateTargetContract = candidateTargetContract.TrimStart('/');
  71.         return candidateTargetContract;
  72.     }
  73.  
  74.     protected virtual IEnumerable<object> GetCandidatesFromRegion(IRegion region, string candidateNavigationContract)
  75.     {
  76.         if (region == null) throw new ArgumentNullException("region");
  77.  
  78.         return region.Views.Where(v =>
  79.                                       string.Equals(v.GetType().Name, candidateNavigationContract, StringComparison.Ordinal) ||
  80.                                       string.Equals(v.GetType().FullName, candidateNavigationContract, StringComparison.Ordinal));
  81.     }
  82. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement