EventToCommand vs Проблема InputBindings - PullRequest
1 голос
/ 07 июля 2011

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

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

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

Работает, как ожидалось

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

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

Проблемный случай

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

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

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

Ответы [ 2 ]

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

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

    public void Close2(KeyEventArgs e)
    {
        if (e.Key == Key.Escape)
            Close();
        e.Handled = true;
    }
0 голосов
/ 07 июля 2011

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

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

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