Когда инициализируется NavigationService? - PullRequest
3 голосов
/ 25 августа 2008

Я хочу перехватить событие NavigationService.Navigating на моей странице, чтобы предотвратить переход пользователя вперед. У меня есть обработчик событий, определенный таким образом:

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

... и это прекрасно работает. Тем не менее, я не уверен, где именно разместить этот код:

NavigationService.Navigating += PreventForwardNavigation;

Если я помещу его в конструктор страницы или в инициализированный обработчик событий, то NavigationService по-прежнему будет нулевым, и я получу исключение NullReferenceException. Однако, если я помещаю его в обработчик событий Loaded для страницы, он вызывается каждый раз при переходе на страницу. Если я правильно понимаю, это означает, что я обрабатываю одно и то же событие несколько раз.

Могу ли я добавить один и тот же обработчик к событию несколько раз (как это произошло бы, если бы я использовал событие Loaded страницы для его подключения)? Если нет, есть ли место между Initialized и Loaded, где я могу выполнить эту проводку?

Ответы [ 2 ]

1 голос
/ 28 июля 2011

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...
    }
}
1 голос
/ 25 августа 2008

@ Эспо, ваша ссылка помогла мне найти обходной путь. Я называю это обходным путем, потому что это некрасиво , но именно это MS делает в своей документации:

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

Таким образом, вам нужно отписаться от событий службы навигации, когда ваша страница выгружается.

+ 1 к вашему ответу за помощь в поиске. Кажется, я не могу пометить свой собственный ответ как «принятый ответ», поэтому я думаю, что пока оставлю его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...