NavigationService.FragmentNavigation NavigationService.FragmentNavigation NavigationService.FragmentNavigation NavigationService.FragmentNavigation Event

Определение

Происходит, когда начинается переход к фрагменту содержимого, что происходит немедленно, если нужный фрагмент находится в текущем содержимом, или после загрузки исходного содержимого XAMLXAML, если нужный фрагмент находится в другом содержимом.Occurs when navigation to a content fragment begins, which occurs immediately, if the desired fragment is in the current content, or after the source XAMLXAML content has been loaded, if the desired fragment is in different content.

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 для обеспечения поведения навигации пользовательских фрагментов.The following example shows how to handle FragmentNavigation to provide custom fragment navigation behavior. В этом случае в примере открывается ошибка XAMLXAML странице, если фрагмент источника XAMLXAML страница не найдена.In this case, the example opens an error XAMLXAML page if the fragment in the source XAMLXAML page is not found.

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 атрибут имеет значение, например:By default, a content fragment is content that is contained by a named UIElement, which is a UIElement whose Name attribute is set, eg:

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

Перейдите к XAMLXAML фрагмент, предоставляя URI с суффиксом в следующем формате:You navigate to a XAMLXAML fragment by providing a URI with a suffix in the following format:

#FragmentName#FragmentName

Ниже показан пример URI, который относится к фрагменту содержимого:The following shows an example of a URI that refers to a content fragment:

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

После загрузки исходной страницы (после LoadCompleted события), начинается переход к фрагменту и NavigationService пытается обнаружить XAMLXAML фрагмента.After the source page loads (after LoadCompleted event is raised), fragment navigation begins and the NavigationService attempts to locate the XAMLXAML fragment. Если XAMLXAML фрагмент обнаруживается, NavigationService предписывает содержимого Навигатор (NavigationWindow, Frame) для отображения в фрагменте.If the XAMLXAML fragment is found, NavigationService instructs the content navigator (NavigationWindow, Frame) to show the fragment. Если вам нужно изменить это поведение, можно обрабатывать FragmentNavigation для обеспечения поведения навигации собственных фрагментов.If you need to change this behavior, you can handle FragmentNavigation to provide your own fragment navigation behavior. FragmentNavigation передается FragmentNavigationEventArgs параметр, который предоставляет свойства, которые полезны для этой цели, включая:FragmentNavigation is passed a FragmentNavigationEventArgs parameter which exposes properties that are useful for this purpose, including:

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

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

Можно обрабатывать FragmentNavigation переопределить реализацию по умолчанию WPF фрагмент с собственную реализацию.You can handle FragmentNavigation to override the default WPF fragment implementation with your own custom implementation. Если сделать это, необходимо задать Handled для true; в противном случае применяется поведение обработки фрагмента WPF по умолчанию.If you do so, you need to set Handled to true; otherwise, the default WPF fragment processing behavior is applied.

Не следует напрямую инициации переходов изнутри FragmentNavigation обработчик событий.You should avoid directly initiating navigation from within a FragmentNavigation event handler. Так как FragmentNavigation возникает во время существующих навигации, запуск нового перехода из FragmentNavigation обработчик событий создает вложенные навигации, которая может вызвать ExecutionEngineException исключение.Since FragmentNavigation is raised during an existing navigation, initiating a new navigation from a FragmentNavigation event handler creates a nested navigation that can cause the ExecutionEngineException to be thrown. Вместо этого можно косвенно инициации перехода посредством создания асинхронный рабочий элемент с помощью Dispatcher.Instead, you can indirectly initiate navigation by creating an asynchronous work item using the Dispatcher.

Примечание

Когда NavigationService вызывает FragmentNavigation, он также выдает Application.FragmentNavigation событий на Application объекта.When NavigationService raises FragmentNavigation, it also raises Application.FragmentNavigation event on the Application object.

Важно!

Переход к фрагменту не поддерживается для свободных XAMLXAML страниц (только для разметки XAMLXAML файлы с Page как корневой элемент) в следующих случаях:Fragment navigation is not supported for loose XAMLXAML pages (markup-only XAMLXAML files with Page as the root element) in the following cases:

• При переходе к фрагменту в свободный XAMLXAML страницы.• When navigating to a fragment in a loose XAMLXAML page.

• При переходе от свободный XAMLXAML страницы к фрагменту другой свободной XAMLXAML страницы.• When navigating from a loose XAMLXAML page to a fragment in another loose XAMLXAML page.

Тем не менее свободный XAMLXAML страницу можно перейти к своим собственным фрагментам.However, a loose XAMLXAML page can navigate to its own fragments.

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

Дополнительно