Comment pouvez-vous rendre un curseur WPF seulement accroché à des positions entières discrètes?

Trop souvent, je veux un curseur WPF qui se comporte comme le System.Windows.Forms.TrackBar de l’ancien. C’est-à-dire que je veux un curseur allant de X à Y mais ne permettant à l’utilisateur que de le déplacer dans des positions entières discrètes.

Comment fait-on cela dans WPF puisque la propriété Value sur le Slider est double?

Si vous définissez vos repères correctement, vous pouvez utiliser IsSnapToTickEnabled . Cela a très bien fonctionné pour moi. Voir MSDN pour plus de détails.

La réponse simple est que vous tirez parti des propriétés IsSnapToTickEnabled et TickFrequency . Autrement dit, activez la case à cocher et définissez la fréquence des ticks sur 1.

Ou, en d’autres termes, profitez des tiques … mais vous ne devez pas forcément montrer les tiques sur lesquelles vous vous êtes accroché.

Découvrez le morceau de xaml suivant:

 

Pour ceux qui souhaitent s’aligner sur des positions spécifiques , vous pouvez également utiliser la propriété Ticks :

  

L’astuce est pratique mais comporte des limitations, par exemple si vous souhaitez afficher uniquement un sous-ensemble de ticks valides. J’ai eu du succès avec deux alternatives: soit lier à un entier ou arrondir la nouvelle valeur. Voici un exemple combiné:

 public int MyProperty { get; set; } private void slider1_ValueChanged(object sender, RoutedPropertyChangedEventArgs e) { (sender as Slider).Value = Math.Round(e.NewValue, 0); }  

Je n’ai aucune idée de la performance de l’un ou de l’autre, mais je n’ai pas eu de problème *.

* Si vous liez également la valeur du curseur à un type de champ de texte, vous verrez que, de temps en temps, si vous utilisez la souris, le champ de texte affichera des décimales. Si vous vous connectez également à un int en même temps, la chaîne vide provoquera une exception de conversion qui ralentira brièvement l’interface utilisateur. Ces problèmes n’ont pas été suffisamment graves pour que je puisse rechercher des solutions.