Valeur ScrollBar définie de manière incorrecte

J’essaie d’implémenter quelque chose de similaire à la possibilité de défilement “infinie” d’Excel; en ce qu’un utilisateur peut faire défiler le “bas” du document; mais continuez ensuite à faire défiler (en utilisant soit la molette de défilement, soit la flèche vers le bas de la barre de défilement), et plus encore, des lignes vides sont générées pour elles. J’ai principalement ce travail (lorsque vous utilisez la molette de la souris, cela fonctionne parfaitement); mais j’ai des problèmes avec la fonctionnalité SmallIncrement – c’est-à-dire; lorsque l’utilisateur clique sur la flèche vers le bas de la barre de défilement, il doit descendre par la barre de défilement. SmallChange, bien qu’il se trouve en bas de la plage de défilement de la barre de défilement.

Voici mon code (dans le gestionnaire de scrollBar_Scroll):

int difference = e.NewValue - e.OldValue; if (e.Type == ScrollEventType.SmallIncrement) { if (difference != scrollBar.SmallChange) { int increase = (scrollBar.SmallChange - difference); scrollBar.Maximum += increase; scrollBar.Value += increase; } } 

En le regardant dans le débogueur, cela définit les valeurs exactement comme je le pensais. Cependant, quelque chose (ne sachant pas quoi) se produit après la fin de la fonction, ce qui a pour effet de rétablir la valeur d’origine de scrollBar.Value, plus un. Si je tiens la flèche vers le bas, cela fonctionne généralement correctement. Il revient encore un peu en place une fois le bouton relâché.

Avez-vous une idée de ce qui pourrait être la cause de ce problème et de tout moyen de le réparer?

À votre santé!

Edit: Voici le code de ma molette. C’est tellement similaire que ça dérange pourquoi ça ne marche pas. Cela se trouve dans le gestionnaire d’événements MouseWheel du panneau MouseWheel .

 int desiredValue = scrollBar.Value - e.Delta; scrollBar.MaximumValue = (Math.Max(normalBottom, desiredValue + scrollBar.LargeChange)); scrollBar.Value = Math.Max(0, desiredValue); 

normalBottom est une variable rappelant la fin “finie” de la barre de défilement – dans Excel, il s’agirait soit des données les plus basses saisies par l’utilisateur, soit de la hauteur de l’écran; donc il défile normalement au-dessus de cette valeur (sans devenir négatif).

Voici ce qui se passe avec votre barre de défilement: lorsque l’utilisateur interagit avec la barre de défilement provoquant l’événement et que votre gestionnaire d’événements est appelé, la valeur de la propriété n’a pas encore été mise à jour. valeur que vous définissez et provoquant l’effet de “saut en arrière” que vous mentionnez. Comment se souvient-il de la valeur à définir? Facile: c’est dans e.NewValue. Et c’est exactement votre solution, pour pouvoir modifier correctement la valeur finale de cette propriété pendant l’événement de défilement, écrivez simplement dans e.NewValue comme suit:

 int difference = e.NewValue - e.OldValue; if (e.Type == ScrollEventType.SmallIncrement) { if (difference != scrollBar.SmallChange) { int increase = (scrollBar.SmallChange - difference); scrollBar.Maximum += increase; e.NewValue = scrollBar.Value + increase; } } 

Je souhaite relier ces pages qui pourraient vous intéresser: http://msdn.microsoft.com/en-us/library/system.windows.forms.scrollbar.maximum.aspx

Remarque dans les remarques (c’est pourquoi, même en déplaçant le Maximun, vous ne l’avancez que 1):

La valeur maximale ne peut être atteinte que par programmation. La valeur d’une barre de défilement ne peut pas atteindre sa valeur maximale par le biais d’une interaction utilisateur lors de l’exécution. La valeur maximale pouvant être atteinte par l’interaction de l’utilisateur est égale à 1 plus la valeur de la propriété Maximum moins la valeur de la propriété LargeChange. Si nécessaire, vous pouvez définir la propriété Maximum sur la taille de l’object -1 pour prendre en compte le terme 1.

http://msdn.microsoft.com/en-us/library/system.windows.forms.scrollbar.scroll.aspx http://msdn.microsoft.com/en-us/library/system.windows.forms.scrolleventargs .newvalue.aspx (Obtient ou définit la nouvelle valeur de la barre de défilement. [Emphasis dans les ensembles])