Advertisement
Wude

Prism4 Custom RegionNavigationContentLoader VB.NET

Apr 8th, 2011
527
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VB.NET 3.87 KB | None | 0 0
  1. Imports Microsoft.Practices.Prism.Regions
  2. Imports System.ComponentModel.Composition
  3. Imports Microsoft.Practices.ServiceLocation
  4. Imports Microsoft.Practices.Prism
  5.  
  6. <PartCreationPolicy(CreationPolicy.Shared)>
  7. <Export(GetType(IRegionNavigationContentLoader))>
  8. Public Class MyRegionNavigationContentLoader
  9.     Implements IRegionNavigationContentLoader
  10.  
  11.     Private ReadOnly mServiceLocator As IServiceLocator
  12.  
  13.     <ImportingConstructor()>
  14.     Public Sub New(ByVal serviceLocator As IServiceLocator)
  15.         Me.mServiceLocator = serviceLocator
  16.     End Sub
  17.  
  18.  
  19.     Public Function LoadContent(ByVal region As Microsoft.Practices.Prism.Regions.IRegion, ByVal navigationContext As Microsoft.Practices.Prism.Regions.NavigationContext) As Object Implements Microsoft.Practices.Prism.Regions.IRegionNavigationContentLoader.LoadContent
  20.         If region Is Nothing Then
  21.             Throw New ArgumentNullException("region")
  22.         End If
  23.         If navigationContext Is Nothing Then
  24.             Throw New ArgumentNullException("navigationContext")
  25.         End If
  26.  
  27.         Dim candidateTargetContract As String = Me.GetContractFromNavigationContext(navigationContext)
  28.  
  29.         Dim candidates = Me.GetCandidatesFromRegion(region, candidateTargetContract)
  30.  
  31.         Dim acceptingCandidates =
  32.             candidates.Where(
  33.                 Function(v)
  34.                     Dim navigationAware = TryCast(v, INavigationAware)
  35.                     If navigationAware IsNot Nothing AndAlso Not navigationAware.IsNavigationTarget(navigationContext) Then
  36.                         Return False
  37.                     End If
  38.  
  39.                     Dim frameworkElement = TryCast(v, FrameworkElement)
  40.                     If frameworkElement Is Nothing Then
  41.                         Return True
  42.                     End If
  43.  
  44.                     navigationAware = TryCast(frameworkElement.DataContext, INavigationAware)
  45.                     Return navigationAware Is Nothing OrElse navigationAware.IsNavigationTarget(navigationContext)
  46.                 End Function)
  47.  
  48.         Dim view = acceptingCandidates.FirstOrDefault()
  49.         If view IsNot Nothing Then
  50.             Return view
  51.         End If
  52.  
  53.         view = Me.CreateNewRegionItem(candidateTargetContract)
  54.         RegionManager.SetRegionManager(CType(view, DependencyObject), New RegionManager())
  55.         region.Add(view, Nothing, True)
  56.  
  57.         Return view
  58.     End Function
  59.  
  60.     Protected Overridable Function CreateNewRegionItem(ByVal candidateTargetContract As String) As Object
  61.         Dim newRegionItem As Object
  62.         Try
  63.             newRegionItem = Me.mServiceLocator.GetInstance(Of Object)(candidateTargetContract)
  64.         Catch ex As ActivationException
  65.             Throw New InvalidOperationException(ex.Message)
  66.         End Try
  67.         Return newRegionItem
  68.     End Function
  69.  
  70.     Protected Overridable Function GetContractFromNavigationContext(ByVal navigationContext As NavigationContext) As String
  71.         If navigationContext Is Nothing Then
  72.             Throw New ArgumentNullException("navigationContext")
  73.         End If
  74.  
  75.         Dim candidateTargetContract = UriParsingHelper.GetAbsolutePath(navigationContext.Uri)
  76.         candidateTargetContract = candidateTargetContract.TrimStart("/"c)
  77.         Return candidateTargetContract
  78.     End Function
  79.  
  80.     Protected Overridable Function GetCandidatesFromRegion(ByVal region As IRegion, ByVal candidateNavigationContract As String) As IEnumerable(Of Object)
  81.         If region Is Nothing Then
  82.             Throw New ArgumentNullException("region")
  83.         End If
  84.         Return region.Views.Where(Function(v) _
  85.                                       String.Equals(v.GetType().Name, candidateNavigationContract, StringComparison.Ordinal) OrElse _
  86.                                       String.Equals(v.GetType().FullName, candidateNavigationContract, StringComparison.Ordinal))
  87.     End Function
  88. End Class
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement