Что такое перенаправленные события и чем они отличаются от обычных событий? - PullRequest
13 голосов
/ 04 августа 2010

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

Ответы [ 2 ]

21 голосов
/ 04 августа 2010

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

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

Маршрутные события - это события с более «путешествующими способностями», как указано в ответе Гишу .Маршрутизируемые события представлены экземпляром класса RoutedEvent + обычное событие .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
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...