2010-05-06 2 views
0

Представьте себе следующий сценарий:Событие 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().

ответ

1

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

Смежные вопросы