NavigationService.FragmentNavigation Событие

Определение

Происходит, когда начинается переход к фрагменту содержимого, что происходит немедленно, если нужный фрагмент находится в текущем содержимом, или после загрузки исходного содержимого 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

Ниже приведен пример 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. Если фрагмент найден, NavigationService инструктирует навигатор содержимого (NavigationWindow, Frame), чтобы отобразить фрагмент. XAMLXAMLIf 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.

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

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