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>

您可以藉由提供具有下列格式尾碼的 URI 來流覽至 XAML 片段:

#FragmentName

以下顯示參考內容片段的 URI 範例:

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

在引發事件) 之後載入來源頁面 (之後 LoadCompleted ,片段流覽就會開始,並 NavigationService 嘗試尋找 XAML 片段。 如果找到 XAML 片段, NavigationService 會指示內容導覽器 (NavigationWindowFrame) 顯示片段。 如果您需要變更此行為,您可以處理 FragmentNavigation 以提供您自己的片段流覽行為。 FragmentNavigation 會傳遞參數 FragmentNavigationEventArgs ,此參數會公開適用于此用途的屬性,包括:

您可以使用自己的自訂實作來覆 FragmentNavigation 寫預設 WPF 片段實作。 如果這樣做,您必須設定 Handledtrue ,否則會套用預設 WPF 片段處理行為。

您應該避免從事件處理常式內 FragmentNavigation 直接起始流覽。 由於 FragmentNavigation 會在現有的導覽期間引發,因此從 FragmentNavigation 事件處理常式起始新的流覽會建立巢狀導覽,而可能導致 ExecutionEngineException 擲回 。 相反地,您可以使用 建立異步工作專案 Dispatcher ,以間接起始流覽。

注意

當 引發 FragmentNavigationNavigationService ,也會在 物件上 Application 引發 Application.FragmentNavigation 事件。

重要

在下列情況下,鬆散 XAML 頁面不支援片段導覽, (標記 Page 專用 XAML 檔案作為根項目) :

• 流覽至鬆散 XAML 頁面中的片段時。

• 從鬆散 XAML 頁面巡覽到另一個鬆散 XAML 頁面中的片段時。

不過,鬆散的 XAML 頁面可以巡覽至自己的片段。

適用於

另請參閱