Я заметил, что в С# я могу обрабатывать события несколькими способами, но я не уверен, что лучше всего использовать, посмотрите здесь:
this.Paint += Form1_Paint;
void Form1_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
g.DrawEllipse(new Pen(Color.Red, 20), new Rectangle(50, 100, 50, 100));
}
или
protected override void OnPaint(PaintEventArgs e)
{
Graphics g = e.Graphics;
g.DrawEllipse(new Pen(Color.Red, 20), new Rectangle(50, 100, 50, 100));
}
Конечно, эти оба заготовки имеют одинаковый результат, а OnPaint()
будет обычно (если бы я его не изменил), просто вызовите метод Form1_Paint
через делегат.
Но какой из них лучше всего использовать?
спасибо
Предпочтительным способом является переопределение метода OnPaint, а не регистрация на событие Paint
. Таким образом, вы не связываете delegate
с вашим Paint
управления Paint
.
Из MSDN:
Поднятие события вызывает обработчик события через делегата. Дополнительные сведения см. В разделе Обработка и повышение событий. Метод OnPaint также позволяет производным классам обрабатывать событие без присоединения делегата. Это предпочтительный метод обработки события в производном классе.
Примечания для наследующих: при переопределении OnPaint в производном классе обязательно вызовите метод OnPaint базового класса, чтобы зарегистрированные делегаты получили событие.
Простой, переопределенный метод OnPaint
для меня (я имею в виду сам контроль или форма). Например: Если вы хотите изменить, как выглядит ваш элемент управления, вы сделаете это в переопределенном методе OnPaint
.
Событие Paint
предназначено для других, поэтому я имею в виду, когда вы решили посмотреть свой контроль, но он не подходит в каком-то месте, вы хотите сделать это немного лучше, вы сделаете это, подписавшись на событие Paint
.
Другими словами: OnPaint
следует использовать, когда вы решаете внешний вид самого типа, где в качестве события Paint
следует использовать, когда вы решаете внешний вид экземпляра.
Эти два подхода не совпадают.
Очень возможно написать код, где вызывается метод OnPaint
, но не использовать метод Paint
.
Фактически, код, который вы написали в своем вопросе, - именно такая ситуация.
В вашем коде отсутствует base.OnPaint(e);
звоните, что на самом деле будет срабатывать событие:
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
Graphics g = e.Graphics;
g.DrawEllipse(new Pen(Color.Red, 20), new Rectangle(50, 100, 50, 100));
}
Поэтому вы действительно должны решить, может ли ваше поведение повлиять на выбор одного из них.
Тем не менее, 99,999% всего кода, который правильно написан там, не является различием.