Сведения о вопросе

HOLY

19:48, 20th August, 2020

Теги

.net   wpf   navigation    

Когда инициализируется NavigationService?

Просмотров: 432   Ответов: 2

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

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

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

NavigationService.Navigating += PreventForwardNavigation;

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

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



  Сведения об ответе

lats

01:21, 17th August, 2020

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

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

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

+1 к вашему ответу за то, что вы помогли мне найти его. Я, кажется, не могу отметить свой собственный ответ как "accepted answer", поэтому я думаю, что пока оставлю его.


  Сведения об ответе

prince

05:05, 24th August, 2020

NavigationService.Navigate запускает как событие NavigationService.Navigating , так и событие AND и событие 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...
    }
}


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться