次の方法で共有


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 を指定します。

# FragmentName

コンテンツ フラグメントを参照する URI の例を次に示します。

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

ソース ページが読み込まれた後 (イベントが発生した後 LoadCompleted )、フラグメント ナビゲーションが開始され、 NavigationService XAML フラグメントの検索が試行されます。 XAML フラグメントが見つかった場合は、 NavigationService フラグメントを表示するようにコンテンツ ナビゲーター (NavigationWindowFrame) に指示します。 この動作を変更する必要がある場合は、 を処理 FragmentNavigation して独自のフラグメント ナビゲーション動作を提供できます。 FragmentNavigation は、次を含む、この目的に役立つプロパティを公開するパラメーターを渡 FragmentNavigationEventArgs します。

  • このナビゲーション サービスを所有するナビゲーター (NavigationWindowFrame)。

  • フラグメント名。

を処理 FragmentNavigation して、既定の WPF フラグメント実装を独自のカスタム実装でオーバーライドできます。 これを行う場合は、 を にtrue設定Handledする必要があります。それ以外の場合は、既定の WPF フラグメント処理動作が適用されます。

イベント ハンドラー内から直接ナビゲーションを開始しないようにする FragmentNavigation 必要があります。 は既存のナビゲーション中に発生するため FragmentNavigation 、イベント ハンドラーから新しいナビゲーションを FragmentNavigation 開始すると、入れ子になったナビゲーションが作成され、 ExecutionEngineException がスローされる可能性があります。 代わりに、 を使用して非同期作業項目を作成することで、間接的にナビゲーションを Dispatcher開始できます。

注意

が 発生FragmentNavigationするとNavigationService、 オブジェクトに対Applicationするイベントも発生Application.FragmentNavigationします。

重要

次の場合、フラグメント ナビゲーションは、緩やかな XAML ページ (ルート要素として を含む Page マークアップのみの XAML ファイル) ではサポートされていません。

• 緩やかな XAML ページ内のフラグメントに移動する場合。

• 緩い XAML ページから別の緩い XAML ページ内のフラグメントに移動する場合。

ただし、Loose XAML ページは、自身のフラグメントに移動できます。

適用対象

こちらもご覧ください