Событие OnPaint во время обратного вызова, когда форма находится ниже? - PullRequest
0 голосов
/ 06 мая 2010

Представьте себе следующий сценарий:

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 ().

1 Ответ

1 голос
/ 06 мая 2010

Попробуйте использовать Refresh () вместо Invalidate (). В любом случае, это работает для меня более последовательно.

...