2008-08-25 12 views
3

ユーザーが前方にナビゲートできないように、私のページからNavigationService.Navigatingイベントをキャッチしたいと思います。私はイベントハンドラを定義しています:NavigationServiceはいつ初期化されますか?

void PreventForwardNavigation(object sender, NavigatingCancelEventArgs e) 
{ 
    if (e.NavigationMode == NavigationMode.Forward) 
    { 
     e.Cancel = true; 
    } 
} 

...それはうまくいきます。しかし、私はこのコードを配置する場所を正確にわからない午前:私はページ、または初期化イベントハンドラのコンストラクタに配置した場合、その後のNavigationServiceはまだnullで、私はとNullReferenceExceptionを取得

NavigationService.Navigating += PreventForwardNavigation; 

。しかし、ページのLoadedイベントハンドラに配置すると、ページがナビゲートされるたびに呼び出されます。私が正しいことを理解すれば、それは同じイベントを何回も処理していることを意味します。

私は同じイベントハンドラを複数回追加しても構いません(ページのLoadedイベントを使用するのと同じように)そうでない場合は、この配線を行うことができる初期化済みとロード済みの間にいくつかの場所がありますか?

答えて

1

@Espoあなたのリンクは私に回避策を見つけるのを助けました。それは醜いだので、私はこの問題を回避それを呼び出すが、それはMS自身が自分のドキュメントに何をすべきかです:

public MyPage() // ctor 
{ 
    InitializeComponent(); 
    this.Loaded += delegate { NavigationService.Navigating += MyNavHandler; }; 
    this.Unloaded += delegate { NavigationService.Navigating -= MyNavHandler; }; 
} 

ページがアンロードされたときですから、基本的にナビゲーションサービスのイベントから退会に持っています。

+1私はそれを見つけるのを手伝ってくれたあなたの返答に+1します。私は自分自身の反応を「受け入れられた答え」とすることはできないように思われるので、今はそれを残しておきます。

1

NavigationService.Navigateは、NavigationService.NavigatingイベントとApplication.Navigatingイベントの両方をトリガします。私はこの問題を次のように解決しました:

public class PageBase : Page 
{ 
    static PageBase() 
    { 
     Application.Current.Navigating += NavigationService_Navigating; 
    } 

    protected static void NavigationService_Navigating(object sender, NavigatingCancelEventArgs e) 
    { 
     // put your event handler code here... 
    } 
} 
関連する問題