2010-05-06 14 views
0

Imaginez le scénario suivant:Événement OnPaint lors d'un rappel lorsque le formulaire est ci-dessous?

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); 
} 

Maintenant, OnePanelInThisForm tire correctement lorsque le formulaire est chargé. Mais si SomeEventOcurred est déclenché à partir de "SomeForm", l'événement paint est et non. Si je ferme et rouvre le formulaire correctement repeint. Si j'ajoute un bouton au formulaire qui s'exécute: OnePanelInThisForm.Invalidate(); le panneau est correctement repeint.

Qu'est-ce qui me manque?

MISE À JOUR: Clarification. (pourquoi ne pas le faire en premier lieu ...)

J'ai un FORM_A. Ce FORM_A a un panneau qui remplace l'événement Paint. C'est un WinForm standard. Dans la peinture, il dessine un cercle. Cela marche. Il s'avère que FORM_A a un bouton qui ouvre FORM_B. Mais avant de le faire, il s'abonne à un événement personnalisé dans FORM_B appelé: SomeEvent. (voir l'exemple ci-dessus). Donc, FORM_B peut dire à FORM_A à propos de "SomeEvent".

Maintenant, FORM_B est également un formulaire WinForm normal. Et il a un bouton normal. Dans l'événement Click de ce bouton, il ouvre FORM_C. FORM_C a également un événement appelé SomeEvent et, évidemment, FORM_B s'abonne à cet événement. Exactement comme avant. L'idée est que FORM_C a un bouton qui déclenchera cet événement, notifiant les abonnés intéressés. Dans ce cas, lorsque FORM_C déclenche l'événement, FORM_B est souscrit et intéressé. Lorsque FORM_B reçoit le rappel, la seule chose à faire est de ... notifier aux parties intéressées (dans ce cas, FORMULAIRE A) que l'événement a été déclenché.

Maintenant, même si le formulaire C est toujours le formulaire supérieur, la callstack retourne à FormA, à la méthode définie comme rappel du 1er événement.

Ce code s'exécute. Tout ce qu'il fait est vraiment somePanel.Invalidate() (ou Refresh(), mêmes résultats). Un point d'arrêt dans la méthode PAINT de ce panneau indique que le code n'est pas appelé. Aucun événement Paint n'est déclenché malgré son invalidation. Je suppose que cela se produit parce que le formulaire (et donc le panneau) est en fait couvert par FORMB et FORMC (toujours ouvert).

Et c'est tout. Si je ferme le formulaire C puis le formulaire B, le formulaire A N'augmente PAS l'événement de peinture. J'ai essayé d'invalider le panneau sur l'activation du formulaire, mais cela n'arrive pas.

Si je ferme le formulaire A et le rouvre, le dessin est, bien sûr, correct.

Espérons que cela soit plus clair.

Il n'y a pas beaucoup de code car c'est assez simple, FORM A> B> C (événement de feu) -> B -> A -> Invalidate(). Essayez d'utiliser Refresh() au lieu de Invalidate().

Répondre

1

Cela semble fonctionner de manière plus cohérente pour moi, de toute façon.