Show / Hide Table of Contents

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

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

Пример

В этом примере пользовательский класс, основанный на 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
  • Маркировка перенаправленных событий как обработанных и обработка классов
  • Обработка перенаправленных событий
  • Общие сведения о перенаправленных событиях
Back to top Неофициальная документация по .NET на русском языке. Лицензия: CC-BY 4.0. Основано на документации по .NET с Microsoft Docs
Generated by DocFX