NavigationService.FragmentNavigation Событие

Определение

Происходит при начале навигации по фрагменту содержимого, которое происходит немедленно, если нужный фрагмент находится в текущем содержимом или после загрузки исходного содержимого XAML, если нужный фрагмент находится в другом содержимом.

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 

Тип события

Примеры

В следующем примере показано, как обрабатывать FragmentNavigation поведение пользовательской навигации фрагментов. В этом случае пример открывает страницу XAML ошибки, если фрагмент на исходной странице XAML не найден.

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

Комментарии

По умолчанию фрагмент контента — это содержимое, содержащееся именованным UIElement, который является атрибутом, заданным UIElementName . Рассмотрим пример.

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

Перейдите к фрагменту XAML, указав универсальный код ресурса (URI) с суффиксом в следующем формате:

# Имя фрагмента

Ниже показан пример универсального кода ресурса (URI), который ссылается на фрагмент содержимого:

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

После загрузки исходной страницы (после LoadCompleted возникновения события) начинается навигация фрагментов и NavigationService попытки найти фрагмент XAML. Если фрагмент XAML найден, NavigationService укажите навигатор содержимого (NavigationWindow,), Frameчтобы отобразить фрагмент. Если вам нужно изменить это поведение, можно выполнить обработку FragmentNavigation , чтобы обеспечить собственное поведение навигации фрагментов. FragmentNavigation передается FragmentNavigationEventArgs параметр, предоставляющий свойства, полезные для этой цели, в том числе:

  • Навигатор, принадлежащий этой службе навигации (NavigationWindow, Frame).

  • Имя фрагмента.

Вы можете обрабатывать FragmentNavigation, чтобы переопределить реализацию фрагмента по умолчанию WPF с помощью собственной пользовательской реализации. При этом необходимо задать для параметра Handled значение true; в противном случае применяется поведение обработки фрагментов по умолчанию WPF.

Не следует напрямую инициировать навигацию из обработчика FragmentNavigation событий. Так как FragmentNavigation возникает во время существующей навигации, инициируя новую навигацию из FragmentNavigation обработчика событий, создается вложенная навигация, которая может привести ExecutionEngineException к возникновению ошибки. Вместо этого можно косвенно инициировать навигацию, создав асинхронный рабочий элемент с помощью .Dispatcher

Note

При NavigationService возникновении FragmentNavigationон также вызывает Application.FragmentNavigation событие объекта Application .

Important

Навигация фрагментов не поддерживается для свободных страниц XAML (файлы XAML только разметки с Page корневым элементом) в следующих случаях:

  • При переходе к фрагменту на свободной странице XAML.>
  • При переходе с свободной страницы XAML на фрагмент на другой свободной странице XAML.

Однако свободная страница XAML может переходить к собственным фрагментам.

Применяется к

См. также раздел