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に含まれるコンテンツであり、Name属性が設定されているUIElementです。 例えば次が挙げられます。
<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 フラグメント実装を独自のカスタム実装でオーバーライドできます。 その場合は、Handled を true に設定する必要があります。それ以外の場合は、既定のWPFフラグメント処理動作が適用されます。
FragmentNavigation イベント ハンドラー内から直接ナビゲーションを開始しないようにする必要があります。 FragmentNavigationは既存のナビゲーション中に発生するため、FragmentNavigation イベント ハンドラーから新しいナビゲーションを開始すると、入れ子になったナビゲーションが作成され、ExecutionEngineExceptionがスローされる可能性があります。 代わりに、 Dispatcherを使用して非同期作業項目を作成することで、間接的にナビゲーションを開始できます。
Note
NavigationServiceがFragmentNavigationを発生させると、Application.FragmentNavigation オブジェクトApplicationイベントも発生します。
Important
次の場合、フラグメント ナビゲーションは、緩やかな XAML ページ (ルート要素として Page を持つマークアップのみの XAML ファイル) ではサポートされていません。
- 緩い XAML ページ内のフラグメントに移動する場合。>
- ルーズ XAML ページから別のルーズ XAML ページ内のフラグメントに移動する場合。
ただし、緩やかな XAML ページは、独自のフラグメントに移動できます。