2009-07-22 4 views
7

Je voudrais déclencher le contrôle de cible glisser pour se redessiner (via invalider ou rafraîchir) pendant les événements DragEnter et DragLeave. Le code ressemble à:Redessiner pendant le glisser-déposer

protected override void OnDragEnter (DragEventArgs drgargs) 
{ 
    //-- Set a property that affects drawing of control, then redraw 
    this.MyProperty = true; 
    this.Refresh(); //-- Does nothing???  
} 

protected override void OnDragLeave (EventArgs e) 
{ 
    //-- Set a property that affects drawing of control, then redraw 
    this.MyProperty = false; 
    this.Refresh(); //-- Does nothing???  
} 

Il ne redessine pas vraiment le contrôle, la méthode OnPaint n'est pas appelé par le Refresh() dans ces événements. Est-ce qu'il y a un moyen de faire ça? Je ne dois pas comprendre quelque chose ici.

MISE À JOUR: La réponse fournie par jasonh ne fonctionne pas. Lorsque vous utilisez Invalidate() ou Invalidate (rect), le contrôle n'est pas réellement mis à jour. Ceci appelle pendant une action glisser-déposer. D'autres idées? Pouvez-vous déclencher un redessin d'un contrôle pendant un glisser-déposer? Merci!

MISE À JOUR 2: Je créé un exemple de projet et n'a pas pu obtenir ce pas travail. Soupir ... J'ai finalement retrouvé un peu de code dans OnPaint qui causait le problème. Donc, cela s'est avéré être plus de moi ne pas comprendre comment le débogueur a fonctionné (il n'a jamais frappé les points de rupture dans l'OnPaint ... ne sais toujours pas pourquoi). Invalidate(), Refresh() fonctionnent tous les deux. JasonH obtient la réponse car elle était finalement correcte et a également montré comment invalider juste une partie d'un contrôle ... Je ne savais pas à ce sujet.

Merci pour votre aide!

+0

Je suppose que vous n'avez pas défini AllowDrop sur true. – jasonh

+0

Oui, AllowDrop est défini sur true. Le glisser-déposer est en cours. Juste le redessin du contrôle n'est pas (OnPaint n'est pas appelé après Invalidate() ou Refresh()). –

Répondre

4

Appelez this.Invalidate() pour que le formulaire/contrôle se redessine automatiquement. Si vous connaissez la région spécifique, appelez l'une des méthodes surchargées pour spécifier les éléments à invalider. Par exemple:

Rectangle toInvalidate = new Rectangle(drgargs.X - 50, drgargs.Y - 50, 50, 50); 
this.Invalidate(toInvalidate); 

Cela invaliderait une zone de 50 pixels autour de la zone de traînée.

+2

Cela n'a pas fonctionné. La question était spécifiquement de le faire lors d'un événement drag-n-drop. Si cela fonctionne pour vous, il doit y avoir quelque chose que je fais mal ... ... –

+1

Je ne sais pas pourquoi je suis downvoted, puisque Invalidate fait exactement ce qu'il est censé faire. – jasonh

+0

Assurez-vous que UserControl a la propriété AllowDrop définie sur true.J'ai testé cela dans un projet simple avec une chaîne étant attiré vers le contrôle et il change de couleur (ce que je suis en train de tester) selon que l'utilisateur glisse ou non sur le contrôle. Pouvez-vous poster un exemple d'un projet qui ne fonctionne pas afin que je puisse vous aider à le réparer? – jasonh

2

Il existe trois méthodes apparemment applicables ici:

Control.Invalidate() - marque la commande (région ou rectangle) comme dans le besoin de repeindre, mais ne force pas repeindre, le repeindre est déclenché lorsque tout le reste été pris en charge et l'application devient inactive.

Control.Update() - fait que le contrôle soit immédiatement repeint si des portions ont été invalidées .

Control.Refresh() - provoque l'invalidation du contrôle, puis la mise à jour (immédiatement repeindre lui-même). Donc, Refresh() est la bonne approche.

Ce que je ferais est de définir un point d'arrêt sur l'appel de la méthode d'actualisation et voir si/quand il est frappé.

+0

Il est en train d'être touché. Il s'exécute, mais ne provoque pas l'appel d'OnPaint. –

Questions connexes