.net 2010 l'appel de la fonction DoEvents (oui j'ai envie) de l'intérieur d'un contrôle personnalisé de la bibliothèque
J'ai un contrôle personnalisé de la bibliothèque. Maintenant, il y a un contrôle qui ressemble à un panneau, et quand il s'ouvre, je veux animer la verticale de plus en plus comme ceci:
For h As Single = 0 To finalHeight Step 0.5
Me.Height = CInt(h)
' HERE I WANT TO CALL DoEvents'
Next
Me.Height = finalHeight
Si je ne suis pas d'appeler la fonction DoEvents dans la boucle puis l'animation n'est pas montré, je seulement obtenir la hauteur finale sans un retour visuel le long du chemin.
Je peux appeler la fonction DoEvents de l'intérieur de mon principal projet WinForm, mais ne peut pas, à l'intérieur d'une bibliothèque.
Comment puis-je le faire, sans se noyer dans la profondeur des threads eaux?
- Par la voie, de 0,5 pixels par incréments de non-sens.
Vous devez vous connecter pour publier un commentaire.
Désolé, mais il est complètement impossible de faire à l'aide de la fonction DoEvents en sécurité ici. Rien de bon ne peut se produire lorsque l'utilisateur ferme le formulaire alors que votre animation est en cours. Il va se planter le programme avec un ObjectDisposed exception. Prise de fonction DoEvents sûr, il faut fixer la forme de la propriété Enabled à false afin que l'utilisateur ne peut pas accidentellement provoquer des incidents de ce genre. Un contrôle peut pas raisonnable de définir la du formulaire propriété Enabled à false, et surtout pas pour une animation.
La solution est assez simple, il suffit d'utiliser un chronomètre avec un Intervalle de 15 millisecondes. Beaucoup assez rapide pour faire de l'animation lisse. Vous trouverez un exemple de code qui fait cela dans ma réponse dans ce fil.
Peut-être vous manque juste une référence à (ou à l'importation d')
System.Windows.Forms
?DoEvents
est une méthode statique deApplication
, donc vous devriez être en mesure d'appeler à partir d'une bibliothèque.(Vous avez déjà l'air de savoir que l'utilisation de
DoEvents
est une chose dangereuse, donc je vais passer le message habituel ici).Oui, vous devriez être en mesure d'appeler
À partir de votre bibliothèque de code. Il semble que vous comprenez que la fonction DoEvents est une Mauvaise Idée, donc je ne suis pas sûr de savoir pourquoi vous êtes en l'appelant. Je devine que vous avez ce mettre à l'intérieur d'un remplacement, comme OnVisibleChanged, ou OnPaint - si c'est le cas, vous ne pourrez probablement pas obtenir les résultats que vous êtes après, comme le contrôle rafraîchissante sera suspendu lors de ces opérations.
Ce que vous voulez probablement faire est de créer un seul-tique de la minuterie, et sur les tiques augmentation de la hauteur du contrôle -puis désactiver la minuterie lorsque finalheight est atteint, ou planifier une autre tique si pas. Ou, créer une minuterie et de mettre votre boucle à chaque tick. Assurez-vous que vous êtes conscient de
InvokeRequired
et appels inter-threads en fonction du type de minuterie que vous utilisez.Incapacité à se reproduire.
Viens de tester avec une configuration simple, UserControl dans une assemblée.
Une minuterie sur la MainForm maintient cochant lorsque l'UC appels de la fonction DoEvents() dans une boucle.
Donc: nouveau Look pour votre problème, il n'est pas là où vous pensez qu'elle est.
Dans votre original pour la boucle, placer
Me.Refresh
où vous vouliez l'appeler la fonction doevents.C'est ce que j'ai trouvé: la minuterie, même à des intervalles, c'est vraiment lent. Je ne sais pas pourquoi, mais l'animation est très nerveux avec la minuterie. Simplifié code:
Sans la minuterie j'utilise une boucle:
Il fonctionne maintenant, mais le problème est que la vitesse de l'animation trop de choses dépendent de la machine sur laquelle la boucle est exécutée. Pour cette raison, je voudrais utiliser un Timer, mais comme je l'ai dit il est trop lent.
Un indice?