3

我想从我的页面中捕获 NavigationService.Navigating 事件,以防止用户向前导航。我有一个这样定义的事件处理程序:

void PreventForwardNavigation(object sender, NavigatingCancelEventArgs e)
{
    if (e.NavigationMode == NavigationMode.Forward)
    {
        e.Cancel = true;
    }
}

...而且效果很好。但是,我不确定该代码的确切位置:

NavigationService.Navigating += PreventForwardNavigation;

如果我将它放在页面的构造函数或 Initialized 事件处理程序中,那么 NavigationService 仍然为 null,并且我得到 NullReferenceException。但是,如果我将它放在页面的 Loaded 事件处理程序中,那么每次导航到页面时都会调用它。如果我理解正确,这意味着我要多次处理同一个事件。

我可以多次向事件添加相同的处理程序(如果我使用页面的 Loaded 事件来连接它会发生)?如果没有,在 Initialized 和 Loaded 之间是否有一些地方可以进行这种接线?

4

2 回答 2

1

@Espo 您的链接帮助我找到了解决方法。我称其为解决方法,因为它很难看,但这是 MS 自己在其文档中所做的:

public MyPage() // ctor
{
    InitializeComponent();
    this.Loaded += delegate { NavigationService.Navigating += MyNavHandler; };
    this.Unloaded += delegate { NavigationService.Navigating -= MyNavHandler; };
}

因此,当您的页面被卸载时,您基本上必须取消订阅导航服务的事件。

+1 对您帮助我找到它的回复。我似乎无法将我自己的回答标记为“已接受的答案”,所以我想我现在就留下它。

于 2008-08-25T07:36:17.020 回答
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...
    }
}
于 2011-07-28T17:29:40.253 回答