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 может переходить к собственным фрагментам.