我想从我的Page中捕获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事件将其关联)一样吗?如果没有,那么在“初始化”和“加载”之间是否可以进行此布线?
最佳答案
@Espo您的链接帮助我找到了解决方法。我称它为解决方法,因为它很丑陋,但这是MS自己在其文档中所做的:
public MyPage() // ctor
{
InitializeComponent();
this.Loaded += delegate { NavigationService.Navigating += MyNavHandler; };
this.Unloaded += delegate { NavigationService.Navigating -= MyNavHandler; };
}
因此,当页面卸载时,您基本上必须取消订阅导航服务的事件。
为您的回复+1,以帮助我找到它。我似乎无法将自己的回答标记为“已接受的答案”,因此我想暂时保留一下。
关于.net - NavigationService何时初始化?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25642/