NavigationService.FragmentNavigation Evento
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
Se produce cuando se inicia la navegación a un fragmento de contenido, que se produce inmediatamente, si el fragmento deseado está en el contenido actual o después de cargar el contenido XAML de origen, si el fragmento deseado está en contenido diferente.
public:
event System::Windows::Navigation::FragmentNavigationEventHandler ^ FragmentNavigation;
public event System.Windows.Navigation.FragmentNavigationEventHandler FragmentNavigation;
member this.FragmentNavigation : System.Windows.Navigation.FragmentNavigationEventHandler
Public Custom Event FragmentNavigation As FragmentNavigationEventHandler
Tipo de evento
Ejemplos
En el ejemplo siguiente se muestra cómo controlar FragmentNavigation para proporcionar un comportamiento de navegación por fragmentos personalizado. En este caso, el ejemplo abre una página XAML de error si no se encuentra el fragmento de la página XAML de origen.
void NavigationService_FragmentNavigation(object sender, FragmentNavigationEventArgs e)
{
// Get content the ContentControl that contains the XAML page that was navigated to
object content = ((ContentControl)e.Navigator).Content;
// Find the fragment, which is the FrameworkElement with its Name attribute set
FrameworkElement fragmentElement = LogicalTreeHelper.FindLogicalNode((DependencyObject)content, e.Fragment) as FrameworkElement;
// If fragment found, bring it into view, or open an error page
if (fragmentElement == null)
{
this.NavigationService.Navigate(new FragmentNotFoundPage());
// Don't let NavigationService handle this event, since we just did
e.Handled = true;
}
}
Private Sub NavigationService_FragmentNavigation(ByVal sender As Object, ByVal e As FragmentNavigationEventArgs)
' Get content the ContentControl that contains the XAML page that was navigated to
Dim content As Object = (CType(e.Navigator, ContentControl)).Content
' Find the fragment, which is the FrameworkElement with its Name attribute set
Dim fragmentElement As FrameworkElement = TryCast(LogicalTreeHelper.FindLogicalNode(CType(content, DependencyObject), e.Fragment), FrameworkElement)
' If fragment found, bring it into view, or open an error page
If fragmentElement Is Nothing Then
Me.NavigationService.Navigate(New FragmentNotFoundPage())
' Don't let NavigationService handle this event, since we just did
e.Handled = True
End If
End Sub
Comentarios
De forma predeterminada, un fragmento de contenido es el contenido que contiene un elemento denominado UIElement, que es un UIElement cuyo Name atributo se establece, por ejemplo:
<TextBlock Name="FragmentName">...</TextBlock>
Para navegar a un fragmento XAML, proporcione un URI con un sufijo en el formato siguiente:
# FragmentName
A continuación se muestra un ejemplo de un URI que hace referencia a un fragmento de contenido:
http://www.microsoft.com/targetpage.xaml#FragmentName
Una vez que se cargue la página de origen (después LoadCompleted de que se genere el evento), comienza la navegación por fragmentos y los NavigationService intentos de localizar el fragmento XAML. Si se encuentra el fragmento XAML, NavigationService indica al navegador de contenido (NavigationWindow, Frame) que muestre el fragmento. Si necesita cambiar este comportamiento, puede controlar FragmentNavigation para proporcionar su propio comportamiento de navegación por fragmentos. FragmentNavigation se pasa un FragmentNavigationEventArgs parámetro que expone las propiedades que son útiles para este propósito, entre los que se incluyen:
Navegador que posee este servicio de navegación (NavigationWindow, Frame).
Nombre del fragmento.
Puede controlar FragmentNavigation para invalidar la implementación de fragmentos de WPF predeterminada con su propia implementación personalizada. Si lo hace, debe establecer Handledtrue
en ; de lo contrario, se aplica el comportamiento de procesamiento de fragmentos de WPF predeterminado.
Debe evitar iniciar directamente la navegación desde un FragmentNavigation controlador de eventos. Puesto FragmentNavigation que se genera durante una navegación existente, al iniciar una nueva navegación desde un FragmentNavigation controlador de eventos se crea una navegación anidada que puede provocar que ExecutionEngineException se produzca . En su lugar, puede iniciar la navegación indirectamente mediante la creación de un elemento de trabajo asincrónico mediante .Dispatcher
Nota:
Cuando NavigationService genera FragmentNavigation, también genera Application.FragmentNavigation un evento en el Application objeto .
Importante
La navegación por fragmentos no se admite para páginas XAML sueltas (archivos XAML de solo marcado con Page
como elemento raíz) en los casos siguientes:
• Al navegar a un fragmento en una página XAML flexible.
• Al navegar desde una página XAML flexible a un fragmento de otra página XAML flexible.
Sin embargo, una página XAML dinámica puede navegar a sus propios fragmentos.