NavigationService.FragmentNavigation Evento

Definizione

Si verifica quando inizia lo spostamento verso 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 spostamento dei frammenti 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 da un oggetto denominato UIElement, che è un oggetto il UIElement cui Name attributo è impostato. Per esempio:

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

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

# FragmentName

Di seguito è 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 spostamento del contenuto (NavigationWindow, Frame) di visualizzare il frammento. Se è necessario modificare questo comportamento, è possibile gestire FragmentNavigation per fornire il proprio comportamento di spostamento dei frammenti. FragmentNavigation viene passato un FragmentNavigationEventArgs parametro che espone proprietà utili a questo scopo, tra cui:

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

  • Nome del frammento.

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

È 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 annidata che può causare la ExecutionEngineException generazione di . È invece possibile avviare indirettamente la navigazione creando un elemento di lavoro asincrono usando .Dispatcher

Note

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 debole.>
  • 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