Подтвердить что ты не робот

Что такое перенаправленные события и как они отличаются от обычных событий

Я буду благодарен, если какой-нибудь орган может объяснить простым примером.

4b9b3361

Ответ 1

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

  • При нормальных событиях вам придется обрабатывать событие Click для всех элементов управления, потому что вы не знаете, где пользователь может щелкнуть.
  • С WPF маршрутизированные события события либо "пузырь", либо "туннель" (т.е. перемещаются по дереву пользовательского интерфейса или вниз), если они не найдите обработчик событий, который "обрабатывает" его на текущем уровне. Таким образом, вы можете написать один обработчик для оконного события, то есть TopLevel. (WPF имеет соглашение о парах событий, PreviewXXX и XXX - событие PreviewXXX срабатывает первым и туннели от корня до управления, которое получило стимул, а событие XXX-партнера затем вытекает из дочернего элемента управления до Root). Поэтому, если вы щелкните правой кнопкой мыши, WPF перемещается по иерархии пользовательского интерфейса, вызывая все обработчики, которые он находит (если только кто-то не отметил, что событие "обрабатывается" в аргументах событий.)

Ответ 2

Маршрутизированные события - это события с более "способностями к путешествиям", как указано в ответе Гишу. Маршрутизированные события представлены экземпляром события RoutedEvent class + common.NET, которое обертывает его:

    public class MyClassWithARoutedEvent : UIElement
    {
        public static readonly RoutedEvent DoSomethingEvent;

        public event RoutedEventHandler DoSomething
        {
            add { base.AddHandler ( MyClassWithARoutedEvent.DoSomethingEvent, value );
            remove { base.AddHandler ( MyClassWithARoutedEvent.DoSomethingEvent, value );
        }
   }

В таких ситуациях вы обычно используете рекламируемые события:

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

Кроме того, стоит упомянуть, что вы можете использовать RoutedEvent в своем управлении, даже если он не определяет его или даже не наследует от элемента, который делает. Это потому, что вы действительно можете думать о экземпляре RoutedEvent как о сильном типизированном имени события. Итак, если у вас есть доступ к этому "имени" (вот почему экземпляр маршрутизируемого события обычно публикуется), вы можете это сделать:

public class MyClassWithARoutedEvent : UIElement
    {
        public static readonly RoutedEvent ClickEvent;
        static MyClassWithARoutedEvent  ( )
        {
          ClickEvent = ButtonBase.ClickEvent.AddOwner( typeof ( MyClassWithARoutedEvent ) );
        }

       // A wrapper should be placed here as described above
    }