Переопределение OnPaint никогда не вызывается
Я занимаюсь этим несколько дней, и это сводит меня с ума. У меня есть элемент управления, который наследуется от System.Windows.Forms.Panel, и я пытаюсь переопределить OnPaint. Это просто, прямо IGNORES это.
public class CollapsiblePanel : System.Windows.Forms.Panel
{
public CollapsiblePanel()
{
//
// Required for the Windows Form Designer
//
InitializeComponent();
//
// TODO: Add any constructor code after InitializeComponent call
//
SetStyle
(
ControlStyles.AllPaintingInWmPaint |
ControlStyles.UserPaint | ControlStyles.DoubleBuffer |
ControlStyles.ResizeRedraw | ControlStyles.Selectable ,
true
);
}
protected override void OnPaint(PaintEventArgs e)
{
// This never runs no matter what I try!
base.OnPaint(e);
}
}
Ответы
Ответ 1
У меня такая же проблема только с ProgressBar, когда я пытаюсь переопределить OnPaint.. Он никогда не вызывал.
Я нашел решение здесь: http://web.archive.org/web/20140214234801/http://osix.net/modules/article/?id=826
Вы должны создать конструктор и разрешить рисование пользователя следующим образом:
SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw, true);
Значения по умолчанию, возможно, различаются в зависимости от версии фреймворка и ОС.
Ответ 2
Вызовите this.Invalidate()
, если вы хотите вызвать OnPaint
Ответ 3
У меня была проблема с не видя, что она выполнялась иногда. Но это работает RIGHT AWAY в Windows 7 x64,.NET Framework 4.0. Просто добавьте его в форму.
class Class1 : Panel
{
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
Console.WriteLine("hello world, I'm painting myself");
// Process.Start("notepad.exe");
}
}
Если вы не видите выход консоли, попробуйте строку Process.Start(...)
.