【问题标题】:When is NavigationService initialized?NavigationService 什么时候初始化?
【发布时间】:2008-08-25 04:04:48
【问题描述】:

我想从我的页面中捕获 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 之间有什么地方可以进行这种接线吗?

【问题讨论】:

    标签: .net wpf navigation


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-13
        • 2016-12-10
        • 2012-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多