Поделиться через


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объекте , который является атрибутом UIElement , заданным Name атрибутом, например:

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

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

# FragmentName

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

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

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

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

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

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

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

Примечание

Когда NavigationService вызывает FragmentNavigation, он также вызывает Application.FragmentNavigation событие для Application объекта .

Важно!

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

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

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

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

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

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