web-dev-qa-db-fra.com

Différence entre les événements Resize et SizeChanged

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?

29
Haider Ali Wajihi

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 .

25
Guffa

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.

14
Muhammad Hasan Khan

Parfois, ces réponses proviennent uniquement du code source:

SizeChanged

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.

Redimensionner

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:

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.

LocationChanged et Move

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.

Conclusions

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:

  • Lorsque des contrôles enfants sont ajoutés/supprimés.
  • Lorsque les limites du contrôle changent.
  • Lorsque d'autres changements se produisent, ce qui peut affecter la disposition du contrôle.

    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.

11
Nick Miller