Dans C # .Net dans Winforms, j'ai trouvé deux événements dans presque tous les composants, Resize () et SizeChanged (). Y a-t-il une différence entre eux? Si les deux événements sont identiques, pourquoi C # a-t-il fourni deux événements différents?
Je crée un contrôle utilisateur en C #. Ce contrôle contient une zone de texte. Je souhaite redimensionner la zone de texte lorsque l'utilisateur modifie la taille du contrôle. Je ne sais pas quel événement utiliser et pourquoi?
L'événement Resize
se produit lorsque le contrôle est redimensionné, tandis que l'événement SizeChanged
se produit lorsque la propriété Size
change.
Vous pouvez utiliser l'une ou l'autre, car un redimensionnement entraînera la modification de la propriété Size
. Cependant, vous devriez plutôt utiliser l'événement Layout
, comme recommandé dans la documentation des événements Resize et SizeChanged .
Alors quelle IS la différence entre les événements Resize et SizeChanged?
Croyez-le ou non absolument rien. Une méthode appelle l'autre. Cependant, parce que ce dernier est nommé "Changed", il peut être utilisé pour la liaison de données - donc même si je n'ai aucune preuve concrète, c'est ma théorie sur la raison pour laquelle les deux existent.
Parfois, ces réponses proviennent uniquement du code source:
L'événement SizeChanged
est déclenché par OnSizeChanged()
. Cette fonction est à son tour uniquement appelée par UpdateBounds()
, qui est appelée par plusieurs mécanismes, comprenant principalement la gestion de WM_MOVE
et WM_WINDOWPOSCHANGED
messages.
Toujours à partir de la source, OnSizeChanged()
ne sera appelée que lorsque UpdateBounds()
aura déterminé qu'il y a une différence entre ancienne taille et nouveau taille. Donc, oui, comme les autres l'ont déjà déterminé, l'événement SizeChanged
correspond à la modification de la propriété Size
.
L'événement Resize
est différent, mais pas beaucoup. Elle est augmentée par OnResize()
. Cette fonction est appelée comme résultat direct de OnSizeChanged()
. Cependant, l'inverse n'est pas vrai. C'est-à-dire, OnResize()
NE FAIT PAS appelez OnSizeChanged()
.
La différence réside dans la perspective à partir de laquelle vous utilisez ces API. Si vous vous abonnez simplement à ces événements, il n'y a pratiquement aucune différence. Quoi qu'il en soit, chaque fois que la taille du contrôle est modifiée, les deux événements se déclenchent.
Cependant, si vous héritez de Control
, il faut être conscient des différences suivantes:
OnResize()
will invalidate le contrôle si le style, ControlStyles.ResizeRedraw
est défini.OnResize()
déclenchera une mise en page avec AffectedProperty
réglé sur "Bounds"
.La raison pour laquelle on pourrait se soucier, par exemple, est de s'assurer que leur logique est exécutée avant l'implémentation de base (et donc avant l'invalidation) pour être correctement dessinée à l'écran.
Il s'agit de deux événements de déplacement qui mettent en parallèle SizeChanged
et Resize
presque de manière identique. Les exceptions sont que OnMove()
invalide uniquement lorsque le style, ControlStyles.SupportsTransparentBackColor
est vrai et la couleur de fond est un alpha moins qu'opaque valeur. Et, OnMove()
ne déclenchera pas de mise en page.
Encore une fois, cette différence n'a probablement d'importance que pour contrôler les auteurs.
Après avoir enquêté sur le code source, ma conclusion est que les événements Resize
et Move
sont un abstraction loin des événements de propriété modifiés, et seraient probablement les choix préféré pour souscrire et remplacer ces événements spécifiques.
Comme d'autres le mentionnent, l'événement Layout
et la fonction OnLayout()
sont également un choix décent; cependant, les mises en page peuvent se produire dans de nombreux cas:
Note latérale: "Autres modifications" est vague, mais je suppose que Microsoft fait référence à toute action prises par les héritiers qui nécessitent une mise en page.
S'appuyer trop fortement sur les événements de mise en page peut ralentir votre code/contrôle car ils se produiront plus fréquemment qu'un simple événement de redimensionnement. Ou, il est possible que le moteur de mise en page soit suspendu par SuspendLayout()
, dans ce cas, vous ne pourrez pas réagir aux changements de taille via le Layout
un événement.