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