2008-08-25 92 views
3

我想從我的頁面捕獲NavigationService.Navigating事件,以防止用戶向前導航。我有這樣定義的事件處理程序:什麼時候NavigationService被初始化?

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

...並且工作正常。不過,我不能確定究竟在何處放置此代碼:

NavigationService.Navigating += PreventForwardNavigation; 

如果我把它放在網頁,或初始化事件處理程序的構造函數,那麼的NavigationService仍然是零,我也得到一個NullReferenceException。但是,如果我將它放在Page的Loaded事件處理程序中,那麼每次頁面被導航時都會調用它。如果我理解正確,那意味着我多次處理相同的事件。

我可以添加相同的處理程序的事件多次(我會使用頁面的Loaded事件掛鉤)?如果沒有,在Initialized和Loaded之間有什麼地方可以做這種佈線?

回答

1

@Espo您的鏈接幫助我找到了解決方法。我把它稱爲一種解決方法,因爲它是醜陋,但它是什麼MS自己的文檔中做:

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

所以你基本上要退訂從導航服務的事件時,你的頁面被卸載。

+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... 
    } 
} 
相關問題