2014-09-20 5 views
1

Я знаю, что когда я подкласс элемент управления у меня есть выбор переопределения события или подписавшись на него:Переопределение события элемента управления из вспомогательного класса

public class myPanel : Panel 
{ 
    public myPanel() 
    { 
     this.Paint += myPanel_Paint; 
    } 

    void myPanel_Paint(object sender, PaintEventArgs e) 
    { 
     // 
    } 

    protected override void OnPaint(PaintEventArgs e) 
    { 
     base.OnPaint(e); 
    } 

} 

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

class DrawCtl 
{ 
    public Control CTL { get; set;} 

public DrawCtl(Control Ctl) 
{ 
    CTL = Ctl; 
    CTL.MouseMove += CTL_MouseMove; 
} 

void CTL_MouseMove(object sender, MouseEventArgs e) 
{ 
    // 
} 

То, что я хотел бы знать: Является ли также override событие элемента управления от вспомогательного класса?

+1

Я не уверен, что понимаю это. Вы хотите переопределить член события, например MouseMove, в переменной CTL? Чего вы пытаетесь достичь? Вы хотите изменить добавление/удаление частей события? – Bedford

+1

Можете ли вы сказать мне, что функция «OnPaint» является «защищенной» или нет? обычно этот метод «защищен» ... –

+0

@Mehdi: Я думаю, это ответ, и это «нет». – TaW

ответ

1

OnPaint способ обычно protected; все методы OnXXX - protected, тоже. Вы можете использовать override и использовать его только в производных классах; поэтому вы не можете сделать это в классе помощников ...

2

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

У них есть недостаток, они могут легко сломать ваш класс. Вы уполномочиваете другой код испортить свою картину. Но это не ваша ошибка, конечно, вы можете как бы хорошо получить поддержку вызова об этом :)

который также является причиной того, что вы должны всегда переопределение OnPaint() в своем классе, никогда использовать Paint мероприятие. Потому что теперь вы действительно хотите сцепление и быть в управлении, уменьшая вероятность возникновения несчастных случаев. У вас есть решение сделать, и вы должны придерживаться этого, чтобы ваш контроль вел себя предсказуемо. Выбор, который вы должны сделать, - это когда вызвать base.OnPaint().

У вас есть четыре варианта. Сначала позвоните, затем сделайте свою собственную картину. Делает вас боссом, ваша краска всегда на высоте. Или сделайте свою собственную картину, затем назовите base.OnPaint(). Отправляет эстафету клиентскому коду и «дружественный» компонентно-ориентированный путь. Или положите свою ногу и не называйте ее вообще. Таким образом, обработчик событий Paint не может испортить его. И окончательное оружие, объявите его запечатанным, чтобы никто не мог переопределить ваш метод OnPaint(). Никогда не удивительно, что путь :)

+0

Как обычно, интересные комментарии. Не совсем на тему, хотя, поскольку я не хочу подкласса вообще. – TaW

Смежные вопросы