Проблема EventToCommand и InputBindings

Я создал решение для воспроизведения проблемы, с которой я столкнулся при использовании MVVM-Light EventToCommand vs InputBindings. Проблема связана с тем, что одно окно открывает другое, и если у меня есть InputBinding, связанный, скажем, с клавишей escape и закрывающий второе представление, он закрывает второе представление и возвращается к первому. Если вместо этого я использую EventToCommand, а затем вручную вызываю ту же команду, она закрывает второе представление, оно также закрывает первое.

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

Шаги следующие:

Работает как положено

1) Нажмите кнопку первого окна, чтобы открыть второе.

2) Нажмите клавишу выхода на втором, чтобы использовать входные привязки

Проблема

1) Нажмите кнопку первого окна, чтобы открыть второе.

2) Щелкните текстовое поле «Привет». 3) Нажмите клавишу Escape, чтобы использовать путь EventToCommand, и оба окна закроются?

Пример решения


person Cheval    schedule 07.07.2011    source источник


Ответы (2)


Вы должны уведомить механизм обработки событий WPF о том, что нажатие кнопки было обработано в вашем обработчике событий и что оно не должно всплывать в цепочке событий. Если вы этого не сделаете, ваше текстовое поле вызывает закрытие в активном окне (окно2), а обработчик побега вызывает закрытие в активном окне (окно1, поскольку окно2 уже было закрыто обработчиком побега текстового поля). Итак, если вы измените свою функцию Close2 следующим образом, все будет работать нормально:

    public void Close2(KeyEventArgs e)
    {
        if (e.Key == Key.Escape)
            Close();
        e.Handled = true;
    }
person AxelEckenberger    schedule 10.07.2011
comment
Конечно! Тот факт, что это WPF, не означает, что изменения Windows Eventing. Спасибо. - person Cheval; 11.07.2011

Я думаю, проблема связана с тем, что вы перехватываете событие PreviewKeyDown в прослушивателе EventToCommand. Я думаю, что он реагирует на нажатие клавиши и закрытие окна до того, как сработают события KeyUp и KeyPress. Это означает, что KeyUp и KeyPress будут срабатывать в главном окне, которое реагирует закрытием.

В вашем образце я изменил EventName на PreviewKeyPress, и это, похоже, решило проблему. Я смог нажать Escape и закрыть только верхнее окно.

person NathanAW    schedule 07.07.2011
comment
В реальном коде я изменил PreviewKeyUp, и это тоже сработало. Спасибо. - person Cheval; 11.07.2011