Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Imports Microsoft.Practices.Prism.Regions
- Imports System.ComponentModel.Composition
- Imports Microsoft.Practices.ServiceLocation
- Imports Microsoft.Practices.Prism
- <PartCreationPolicy(CreationPolicy.Shared)>
- <Export(GetType(IRegionNavigationContentLoader))>
- Public Class MyRegionNavigationContentLoader
- Implements IRegionNavigationContentLoader
- Private ReadOnly mServiceLocator As IServiceLocator
- <ImportingConstructor()>
- Public Sub New(ByVal serviceLocator As IServiceLocator)
- Me.mServiceLocator = serviceLocator
- End Sub
- 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
- If region Is Nothing Then
- Throw New ArgumentNullException("region")
- End If
- If navigationContext Is Nothing Then
- Throw New ArgumentNullException("navigationContext")
- End If
- Dim candidateTargetContract As String = Me.GetContractFromNavigationContext(navigationContext)
- Dim candidates = Me.GetCandidatesFromRegion(region, candidateTargetContract)
- Dim acceptingCandidates =
- candidates.Where(
- Function(v)
- Dim navigationAware = TryCast(v, INavigationAware)
- If navigationAware IsNot Nothing AndAlso Not navigationAware.IsNavigationTarget(navigationContext) Then
- Return False
- End If
- Dim frameworkElement = TryCast(v, FrameworkElement)
- If frameworkElement Is Nothing Then
- Return True
- End If
- navigationAware = TryCast(frameworkElement.DataContext, INavigationAware)
- Return navigationAware Is Nothing OrElse navigationAware.IsNavigationTarget(navigationContext)
- End Function)
- Dim view = acceptingCandidates.FirstOrDefault()
- If view IsNot Nothing Then
- Return view
- End If
- view = Me.CreateNewRegionItem(candidateTargetContract)
- RegionManager.SetRegionManager(CType(view, DependencyObject), New RegionManager())
- region.Add(view, Nothing, True)
- Return view
- End Function
- Protected Overridable Function CreateNewRegionItem(ByVal candidateTargetContract As String) As Object
- Dim newRegionItem As Object
- Try
- newRegionItem = Me.mServiceLocator.GetInstance(Of Object)(candidateTargetContract)
- Catch ex As ActivationException
- Throw New InvalidOperationException(ex.Message)
- End Try
- Return newRegionItem
- End Function
- Protected Overridable Function GetContractFromNavigationContext(ByVal navigationContext As NavigationContext) As String
- If navigationContext Is Nothing Then
- Throw New ArgumentNullException("navigationContext")
- End If
- Dim candidateTargetContract = UriParsingHelper.GetAbsolutePath(navigationContext.Uri)
- candidateTargetContract = candidateTargetContract.TrimStart("/"c)
- Return candidateTargetContract
- End Function
- Protected Overridable Function GetCandidatesFromRegion(ByVal region As IRegion, ByVal candidateNavigationContract As String) As IEnumerable(Of Object)
- If region Is Nothing Then
- Throw New ArgumentNullException("region")
- End If
- Return region.Views.Where(Function(v) _
- String.Equals(v.GetType().Name, candidateNavigationContract, StringComparison.Ordinal) OrElse _
- String.Equals(v.GetType().FullName, candidateNavigationContract, StringComparison.Ordinal))
- End Function
- End Class
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement