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

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


person Programer    schedule 05.04.2012    source источник


Ответы (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, чтобы получить информацию о нажатой клавише.

person Matt Hamilton    schedule 05.04.2012
comment
спасибо, это направление, я видел это однажды, там было что-то с обработчиком регистров и прочим. я попробую это и сообщу - person Programer; 05.04.2012
comment
на самом деле вместо кастинга вы можете просто заменить new RoutedEventHandler(..) на new KeyEventHandler(Window_KeyDown) - person BatteryBackupUnit; 21.07.2015

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

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

        }
    }
person ionden    schedule 05.04.2012

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

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

мзЭ.

person muzE    schedule 05.04.2012

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

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

person scibuff    schedule 05.04.2012
comment
У меня такое когда-то было... не помню как скопировал, где-то сейчас не могу найти - person Programer; 05.04.2012

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

person Christoph Fink    schedule 05.04.2012
comment
У меня такое когда-то было... не помню как скопировал, где-то сейчас не могу найти - person Programer; 05.04.2012