我想从我的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/

10-10 07:36