NavigationService何时初始化?

时间:2008-08-25 04:04:49

标签: .net wpf navigation

我想从我的页面捕获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之间是否有一些地方我可以进行这种布线?

2 个答案:

答案 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...
    }
}