Наше приложение основано на стеке страниц, которые являются просто подклассами FrameworkElement
.Главное окно поддерживает этот стек и использует встроенную команду Close
, чтобы закрыть их, просто вытолкнув их из стека.
Теперь в некоторых случаях элемент закрывается (или удаляется из стека)сначала нужно сделать некоторую очистку.И эта страница также прослушивала событие Close
, что казалось правильным решением.
Теперь, поскольку эта страница фактически получит событие до того, как появится окно (команда Close
реализована с помощью 'bubbling').event ') мы думали, что все, что нам нужно сделать, это установить привязку команды на странице, а затем в обработчике установить значение e.Handled
в значение false, и оно будет продолжаться до окна.
Вот код встраница (InitializeCommands
вызывается из конструктора) ...
private void InitializeCommands(){
CommandBindings.Add(
new CommandBinding(ApplicationCommands.Close, Close_Execute, Close_CanExecute)
);
}
private void Close_CanExecute(object sender, CanExecuteRoutedEventArgs e){
// True executes this handler, but blocks the one in the window
// False executes the one in the window, but ignores this one
e.CanExecute = true;
// Doesn't seem to have any effect
e.Handled = false;
}
private void Close_Execute(object sender, ExecutedRoutedEventArgs e){
Console.WriteLine("I want to respond passively!");
// Doesn't seem to have any effect
e.Handled = false;
}
Однако, независимо от того, для чего мы установили это свойство, команда никогда не попадет в главное окно.Если мы удалим привязку команды на странице, она снова заработает, доказав, что страница глотает команду независимо от этого свойства.
Итак, что вам нужно сделать, чтобы страница прослушивала событие Close
пассивно?