NavigationService.FragmentNavigation Evento

Definizione

Si verifica quando inizia lo spostamento su un frammento di contenuto, che si verifica immediatamente, se il frammento desiderato si trova nel contenuto corrente o dopo il caricamento del contenuto XAML di origine, se il frammento desiderato si trova in contenuto diverso.

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 evento

Esempio

Nell'esempio seguente viene illustrato come gestire FragmentNavigation per fornire un comportamento di navigazione del frammento personalizzato. In questo caso, l'esempio apre una pagina XAML di errore se il frammento nella pagina XAML di origine non viene trovato.

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

Commenti

Per impostazione predefinita, un frammento di contenuto è contenuto contenuto denominato UIElement, che è un oggetto il UIElement cui Name attributo è impostato, ad esempio:

<TextBlock Name="FragmentName">...</TextBlock>

Si passa a un frammento XAML fornendo un URI con un suffisso nel formato seguente:

#FragmentName

Di seguito viene illustrato un esempio di URI che fa riferimento a un frammento di contenuto:

http://www.microsoft.com/targetpage.xaml#FragmentName

Dopo il caricamento della pagina di origine (dopo LoadCompleted la generazione dell'evento), inizia lo spostamento tra frammenti e tenta NavigationService di individuare il frammento XAML. Se viene trovato il frammento XAML, NavigationService indica allo strumento di navigazione del contenuto (NavigationWindow, Frame) di visualizzare il frammento. Se è necessario modificare questo comportamento, è possibile gestire FragmentNavigation per fornire un comportamento di spostamento dei frammenti personalizzato. FragmentNavigation viene passato un FragmentNavigationEventArgs parametro che espone le proprietà utili a questo scopo, tra cui:

  • Strumento di navigazione proprietario di questo servizio di navigazione (NavigationWindow, Frame).

  • Nome del frammento.

È possibile gestire FragmentNavigation per eseguire l'override dell'implementazione predefinita del frammento WPF con la propria implementazione personalizzata. In tal caso, è necessario impostare su Handledtrue; in caso contrario, viene applicato il comportamento di elaborazione dei frammenti WPF predefinito.

È consigliabile evitare di avviare direttamente la navigazione dall'interno di un FragmentNavigation gestore eventi. Poiché FragmentNavigation viene generato durante una navigazione esistente, l'avvio di una nuova navigazione da un FragmentNavigation gestore eventi crea una navigazione nidificata che può causare la ExecutionEngineException generazione di . È invece possibile avviare indirettamente la navigazione creando un elemento di lavoro asincrono usando .Dispatcher

Nota

Quando NavigationService genera FragmentNavigation, genera Application.FragmentNavigation anche l'evento sull'oggetto Application .

Importante

Lo spostamento tra frammenti non è supportato per le pagine XAML sciolte (file XAML solo markup con Page come elemento radice) nei casi seguenti:

• Quando si passa a un frammento in una pagina XAML separata.

• Quando si passa da una pagina XAML separata a un frammento in un'altra pagina XAML separata.

Tuttavia, una pagina XAML separata può passare ai propri frammenti.

Si applica a

Vedi anche