Поделиться через


Практическое руководство. Добавление обработки классов для перенаправленных событий

Обновлен: Ноябрь 2007

Перенаправленные события могут быть обработаны с помощью обработчиков классов или экземпляров на любом узле данного маршрута. Обработчики классов вызываются первыми и могут использоваться классами реализации для подавления событий обработчиков экземпляров или введения новых вариантов поведения для событий, которые относятся к базовым классам. В этом примере иллюстрируются два тесно связанных между собой способа реализации обработчиков классов.

Пример

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

Класс UIElement предоставляет виртуальный метод, позволяющий классу обрабатывать событие PreviewMouseLeftButtonDown путем простого переопределения события. Это наиболее простой способ реализации обработки классов, если такой виртуальный метод доступен где-либо в иерархии класса. В следующем коде показана реализация OnPreviewMouseLeftButtonDown в «MyEditContainer», который является производным от Canvas. Реализация помечает событие как обработанное в аргументах и затем добавляет часть кода для предоставления исходному элементу основное видимое изменение.

protected override void OnPreviewMouseRightButtonDown(System.Windows.Input.MouseButtonEventArgs e)
{
    e.Handled = true; //suppress the click event and other leftmousebuttondown responders
    MyEditContainer ec = (MyEditContainer)e.Source;
    if (ec.EditState)
    { ec.EditState = false; }
    else
    { ec.EditState = true; }
    base.OnPreviewMouseRightButtonDown(e);
}

Если нет доступного виртуального метода для базовых классов или для этого конкретного метода, обработка классов может добавляться напрямую с помощью служебного метода класса EventManager, RegisterClassHandler. Этот метод следует вызывать только внутри статической инициализации классов, которые используют обработку классов. В этом примере добавляется еще один обработчик для PreviewMouseLeftButtonDown, и в этом случае зарегистрированный класс является пользовательским классом. В свою очередь, при использовании виртуальных методов зарегистрированный класс является базовым классом UIElement. В случаях, когда и базовые классы, и подклассы регистрируют обработку классов, обработчики подклассов вызываются первыми. Сначала этот обработчик отобразит окно сообщения, а затем будет показано визуальное изменение в обработчике виртуального метода.

static MyEditContainer()
{
  EventManager.RegisterClassHandler(typeof(MyEditContainer), PreviewMouseRightButtonDownEvent, new RoutedEventHandler(LocalOnMouseRightButtonDown));
}
internal static void LocalOnMouseRightButtonDown(object sender, RoutedEventArgs e)
{
  MessageBox.Show("this is invoked before the On* class handler on UIElement");
  //e.Handled = true; //uncommenting this would cause ONLY the subclass' class handler to respond
}

См. также

Задачи

Практическое руководство. Обработка перенаправленных событий

Основные понятия

Маркировка перенаправленных событий как обработанных и обработка классов

Общие сведения о перенаправленных событиях

Ссылки

EventManager