我想从我的页面捕获NavigationService.Navigating事件,以防止用户向前导航。我这样定义了一个事件处理程序:
void PreventForwardNavigation(object sender, NavigatingCancelEventArgs e)
{
if (e.NavigationMode == NavigationMode.Forward)
{
e.Cancel = true;
}
}
......而且工作正常。但是,我不确定这个代码的确切位置:
NavigationService.Navigating += PreventForwardNavigation;
如果我将它放在页面的构造函数或Initialized事件处理程序中,那么NavigationService仍为null,我得到一个NullReferenceException。但是,如果我将它放在Page的Loaded事件处理程序中,则每次导航到页面时都会调用它。如果我理解正确,那意味着我多次处理同一事件。
我可以多次为事件添加相同的处理程序(就像我使用页面的Loaded事件来连接它一样)?如果没有,在Initialized和Loaded之间是否有一些地方我可以进行这种布线?
答案 0 :(得分: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...
}
}