2008-08-25 117 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... 
    } 
} 
相关问题