Проблемы с пониманием и созданием событий в WPF - PullRequest
2 голосов
/ 24 августа 2011

Я новичок в WPF, и я учусь, используя книгу Pro WPF C # 2010.

Теперь в главе о событиях книга объясняет, как создавать события и регистрировать события в WPF, и она дает:в качестве примера, код из класса ButtonBase, который является производным от некоторого другого класса, который код не упоминает четко.

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

Вот код, который я написал:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows;
    using System.Windows.Input;

    namespace WPFRoutedEvents
    {
            public class EventTest
            {
            private string variable = "Event has occured";

            public static readonly RoutedEvent myTestEvent;

            //Constructor
            public static EventTest()
            {
                EventTest.myTestEvent = EventManager.RegisterRoutedEvent("TestEvent", RoutingStrategy.Bubble, typeof (RoutedEventHandler), typeof(EventTest));
            }

            public string getVariable()
            {
                return this.variable;
            }

            public event RoutedEventHandler myTestEvent
            {
                add
                {
                      //Here is the problem
                      // I cannot use base.AddHandler () because it does not exist
                }

                remove
                {
                     //Here is the problem
                     // I cannot use base.RemoveHandler() because it does not exist
                }
            }




        }// end of class EventTest
    }

Теперь, когда этот класс имеетя не могу получить доступ к функции базового класса AddHandler.

У меня следующие вопросы:

1) В каком классе реализована оригинальная функция AddHandler, из которой мне нужно расширитьмой класс?

2) Кто-нибудь, пожалуйста, кратко объясните конвейер от записи и события до окончательной установки его до точки, где он будет вызывать обработчик, когдаэто происходит, т. е. начинается с реализации события, обработчика события, регистрации события, определения синтаксиса обработчика события (часть кодирования) и конвейера с момента, когда происходит событие en, ​​до его обработки (фактическое выполнение события и события).обработчик).Это поможет мне лучше понять текст.

3) В книге я обнаружил ClickEvent, который уже был реализован где-то, создан, зарегистрирован и, наконец, обработан.Что я хочу знать, так это как программист зарегистрирует какой-то новый тип события, которое еще не было реализовано (например, это может быть тройной щелчок, просто для примера, в противном случае я знаю, что оно существует), а затем зарегистрирует это событие, а затемспроектировать обработчик.

4) Существуют ли какие-либо типы событий или какой-либо другой эквивалент, которые происходят в определенном состоянии данных (некоторая переменная, ресурс и т. д.) вместо некоторого события устройства ввода?Как, например, при перетаскивании нарисовать линию, она достигает определенной длины?

Спасибо!

1 Ответ

2 голосов
/ 24 августа 2011

Система RoutedEvent сосредоточена вокруг класса UIElement и ее AddHandler метода .
Вы должны создавать маршрутизируемые события только в тех классах, которые наследуют UIElement.

Все остальные классы должны использовать обычные события CLR.


Когда вы регистрируете перенаправленное событие, UIElement подготовит хранение обработчиков для события в экземплярах вашего класса.
Когда вы вызываете AddHandler, UIElement добавит обработчик к чему-то вроде Dictionary<RoutedEvent, Delegate>.
Когда вы добавляете обработчик событий в XAML, сгенерированный код MyFile.xaml.g.cs добавит обработчик с использованием средства доступа к событиям CLR.Когда вы вызываете RaiseEvent, UIElement будет перебирать свой словарь и вызывать каждый обработчик.

Для получения дополнительной информации о полевых и пользовательских событиях в C # см. мой блог .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...