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



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

617   5  

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) {

        }
    }

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

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

MzE.

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

В качестве альтернативы, взгляните на шаблон Observer

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

Comments

    Ничего не найдено.