Представьте себе следующий сценарий:
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 имеет Panel, которая переопределяет событие 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 получает Call Back, единственное, что он делает, это… уведомляет заинтересованные стороны (в данном случае, FORM A), что событие было инициировано.
Теперь, даже когда Форма C все еще является верхней формой, стек вызовов возвращается к FormA, к методу, определенному как обратный вызов из 1-го события.
Этот код выполняется. Все, что он делает, - это somePanel.Invalidate () (или Refresh (), те же результаты).
Точка останова в методе PAINT этой панели показывает, что код не вызывается. Событие Paint не вызывается, несмотря на то, что оно признано недействительным. Я предполагаю, что это происходит потому, что форма (и, следовательно, панель) фактически покрыта FORMB и FORMC (все еще открыт).
И это все. Если я закрою форму C, а затем форму B, форма A все еще не вызывает событие рисования. Я пытался аннулировать панель при активации формы, но этого не произошло.
Если я закрою форму A и снова открою ее, рисунок, конечно, будет правильным.
Надеюсь, это прояснит ситуацию.
На самом деле не так много кода, так как он довольно прост: FORM A> B> C (событие пожара) -> B -> A -> Invalidate ().