NavigationService.FragmentNavigation 事件
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
發生于流覽至內容片段時,如果所需的片段位於目前內容中,或載入來源 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 會指示內容導覽器 (NavigationWindow , Frame) 顯示片段。 如果您需要變更此行為,您可以處理 FragmentNavigation 以提供您自己的片段流覽行為。 FragmentNavigation 會傳遞參數 FragmentNavigationEventArgs ,此參數會公開適用于此用途的屬性,包括:
擁有此導覽服務的導覽器 (NavigationWindow , Frame) 。
片段名稱。
您可以使用自己的自訂實作來覆 FragmentNavigation 寫預設 WPF 片段實作。 如果這樣做,您必須設定 Handled 為 true
,否則會套用預設 WPF 片段處理行為。
您應該避免從事件處理常式內 FragmentNavigation 直接起始流覽。 由於 FragmentNavigation 會在現有的導覽期間引發,因此從 FragmentNavigation 事件處理常式起始新的流覽會建立巢狀導覽,而可能導致 ExecutionEngineException 擲回 。 相反地,您可以使用 建立異步工作專案 Dispatcher ,以間接起始流覽。
注意
當 引發 FragmentNavigation 時 NavigationService ,也會在 物件上 Application 引發 Application.FragmentNavigation 事件。
重要
在下列情況下,鬆散 XAML 頁面不支援片段導覽, (標記 Page
專用 XAML 檔案作為根項目) :
• 流覽至鬆散 XAML 頁面中的片段時。
• 從鬆散 XAML 頁面巡覽到另一個鬆散 XAML 頁面中的片段時。
不過,鬆散的 XAML 頁面可以巡覽至自己的片段。