Представьте себе следующий сценарий:Событие OnPaint во время обратного вызова, когда форма ниже?
this.SetStyle(ControlStyles.UserPaint, true); //this doesn’t change anything
…
void OpenSomeForm()
{
SomeForm sf = new SomeForm();
sf.SomeEvent += new … (SomeEventOcurred);
sf.ShowDialog();
}
private void SomeEventOcurred(…)
{
OnePanelInThisForm.Invalidate();
}
private void OnePanelInThisForm_Paint(object sender, PaintEventArgs e)
{
DoSomeDrawing(e.Graphics);
}
Теперь OnePanelInThisForm правильно, когда рисует форму нагрузки. Но если SomeEventOcurred уволен из «SomeForm», событие рисования не уволено. Если я закрываю и снова открываю форму, она правильно перекрашивается. Если я добавлю кнопку в форму, которая выполняет: OnePanelInThisForm.Invalidate(); панель правильно перерисовывается.
Что мне не хватает?
ОБНОВЛЕНИЕ: Уточнение. (почему бы нам не сделать это в первую очередь ...)
У меня есть FORM_A. Этот FORM_A имеет панель, которая переопределяет событие Paint. Это стандартный WinForm. В Paint он рисует круг. Это работает. Оказывается, что FORM_A имеет кнопку, которая открывает FORM_B. Но прежде чем это сделать, он подписывается на пользовательское событие в FORM_B, называемое: SomeEvent. (см. пример выше). Поэтому FORM_B может сообщить FORM_A о «SomeEvent».
Теперь FORM_B также является обычным WinForm. И у него нормальная кнопка. В событии Click этой кнопки открывается FORM_C. FORM_C также имеет событие, называемое SomeEvent, и, очевидно, FORM_B подписывается на это событие. Точно как раньше. Идея заключается в том, что FORM_C имеет кнопку, которая будет запускать это событие, сообщая заинтересованным абонентам. В этом случае, когда FORM_C запускает событие, FORM_B подписывается и заинтересован.
Когда FORM_B получает обратный вызов, единственное, что он делает, это ... уведомить заинтересованные стороны (в данном случае ФОРМА А) о том, что событие было уволено.
Теперь, хотя форма C по-прежнему является верхней формой, callstack возвращается к FormA, к методу, определенному как обратный вызов из 1-го события.
Этот код Выполняется. Все, что он делает, это действительно somePanel.Invalidate() (или Refresh(), те же результаты).
Точка останова в методе PAINT этой панели показывает, что код не вызывается. Событие Paint не создано, несмотря на то, что оно недействительно. Я предполагаю, что это происходит потому, что форма (и, следовательно, панель) фактически покрывается FORMB и FORMC (все еще открыто).
И все. Если я закрываю форму C, а затем форму B, форма A все еще НЕ поднимает событие рисования. Я попробовал аннулировать панель активации формы, но этого не происходит.
Если я закрою форму A и снова ее открою, рисунок, конечно, правильный.
Надеюсь, что это делает его более понятным.
Существует не очень много кода, так как это довольно просто, FORM A> B> C (событие пожара) -> B -> A -> Invalidate().