NavigationService何时初始化?
时间:2020-03-05 18:42:43 来源:igfitidea点击:
我想从我的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,以帮助我找到它。我似乎无法将自己的回答标记为"已接受的答案",因此我想暂时保留一下。