Я не знаю, что именно вы хотите знать. Все довольно просто: вы можете зарегистрировать обработчик на уровне экземпляра (объекта) или на уровне класса.
Разница в том, что когда вы регистрируете событие на уровне класса, оно будет вызываться первым, до того, как будут обработаны какие-либо экземпляры уровня (конечно, туннелирование или образование пузырьков по-прежнему имеют место раньше, если класс обработки ниже / выше в логическом дереве). Таким образом, вы можете обработать это событие на уровне класса и отфильтровать, должно ли это событие обрабатываться экземпляром или нет (установив e.Handled = true
, вы остановите событие для прохождения через другие обработчики). В некоторых случаях это может быть полезно, но пока я не могу поделиться своим примером.
В этом примере будет зарегистрирован обработчик события, который будет вызываться только при возникновении события для определенного экземпляра элемента:
DockPanel panel = new DockPanel();
panel.AddHandler(Button.ClickEvent, new RoutedEventHandler(Button_Click));
И это создаст обработчик события, который будет вызываться каждый раз, когда любой DockPanel
получит событие Button.Click, прежде чем будет вызван обработчик экземпляра этого DockPanel
:
EventManager.RegisterClassHandler(typeof(DockPanel),
Button.ClickEvent, new RoutedEventHandler(ButtonClass_Click));
Если бы методы были:
private void ButtonClass_Click(object sender, RoutedEventArgs e)
{
Debug.Write("Class level handler");
}
private void Button_Click(object sender, RoutedEventArgs e)
{
Debug.Write("Instance level handler");
}
Это создаст вывод:
Обработчик уровня класса
Обработчик уровня экземпляра
Но если в обработчике уровня класса вы установите для аргументов события значение handeled (e.Handled = true;
), это отфильтрует это событие для обработчика уровня экземпляра (и всплывет в логическом дереве).