Как установить EvenHandler в WPF для всех окон (всего приложения)?

Как я могу установить обработчик событий (например, keydown) для всего решения, а не одного окна?

5 ответов

Решение

Зарегистрируйте глобальный обработчик событий в своем классе приложения (App.cs), например так:

public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);

        EventManager.RegisterClassHandler(typeof(Window), Window.KeyDownEvent, new RoutedEventHandler(Window_KeyDown));
    }

    void Window_KeyDown(object sender, RoutedEventArgs e)
    {
        // your code here
    }
}

Это будет обрабатывать KeyDown событие для любого Window в вашем приложении. Вы можете разыграть e в KeyEventArgs чтобы получить информацию о нажатой клавише.

Как насчет этого:

 public partial class App : Application {
        protected override void OnStartup(StartupEventArgs e) {
            EventManager.RegisterClassHandler(typeof(Window), Window.KeyDownEvent, new RoutedEventHandler(KeyDown));
            base.OnStartup(e);
        }

        void KeyDown(object sender, RoutedEventArgs e) {

        }
    }

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

в качестве альтернативы, посмотрите на Observer шаблон

Вы должны использовать делегата, чтобы связать событие (где бы оно ни было) и функцию, которую вы готовы работать, когда событие переходит.

Вы можете загрузить столько событий, сколько хотите, своему делегату.

MZE.

Ты не можешь
Каждый раз вы регистрируете событие во всех окнах и передаете его глобальной функции / событию или (в случае нажатия клавиши или аналогичной) вы используете глобальный "перехват" (например, ЭТО для клавиатуры).

Другие вопросы по тегам