111 votes

Comment faire un curseur WPF s’aligner uniquement sur postes entiers discrets ?

Trop souvent, je veux un curseur WPF qui se comporte comme le System.Windows.Forms.TrackBar de vieux. Autrement dit, je veux un curseur qui va de X à Y, mais seulement permet à l’utilisateur de le déplacer dans des postes discrets entier.

Comment faire cela dans WPF étant donné que la propriété Value sur le curseur est double ?

166voto

cplotts Points 7630

La réponse simple est que vous prenez avantage de la IsSnapToTickEnabled et TickFrequency propriétés. C'est, tourner à l'accrochage des tiques et la tique fréquence à 1.

Ou, en d'autres mots ... profiter de tiques ... mais vous n'avez pas nécessairement besoin de montrer les tiques que vous êtes l'accrochage.

Découvrez le morceau suivant du code xaml:

<Slider
    Orientation="Vertical"
    Height="200"
    Minimum="0"
    Maximum="10"
    Value="0"
    IsSnapToTickEnabled="True"
    TickFrequency="1"
/>

J'ai juste eu à poser et à répondre à cette question car je viens d'avoir à trouver pour la deuxième fois comment faire.

Maintenant, c'est juste un Google ou StackOverflow de recherche, de loin ... au moins je l'espère.

90voto

Brian Stewart Points 4553

Si vous cochez correctement les graduations, vous pouvez utiliser IsSnapToTickEnabled . Cela a plutôt bien fonctionné pour moi. Voir MSDN pour plus de détails.

45voto

Dave Points 5649

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

 <Slider Minimum="1" Maximum="500" IsSnapToTickEnabled="True" Ticks="1,100,200,350,500" />
 

9voto

Quail Points 598

Le composant logiciel enfichable astuce est très pratique mais a des limites, par exemple si vous souhaitez afficher uniquement un sous-ensemble de valide les tiques. J'ai eu du succès avec deux solutions: soit se lier à un nombre entier ou autour de la nouvelle valeur. Ici est un exemple:

public int MyProperty { get; set; }

private void slider1_ValueChanged(object sender,
    RoutedPropertyChangedEventArgs<double> e)
{
    (sender as Slider).Value = Math.Round(e.NewValue, 0);
}

<Slider
    Name="slider1"
    TickPlacement="TopLeft"
    AutoToolTipPlacement="BottomRight"
    ValueChanged="slider1_ValueChanged"
    Value="{Binding MyProperty}"
    Minimum="0" Maximum="100" SmallChange="1" LargeChange="10"
    Ticks="0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100"/>

Je n'ai aucune idée de la façon dont la performance se compare à la snap truc, mais je n'ai pas eu de difficulté*.

*Si vous aussi lier la valeur de la glissière pour un type de champ de texte, vous ferez l'expérience que, chaque fois dans un certain temps, si à l'aide de la souris, le champ de texte montrera les décimales. Si vous aussi vous lier à un int dans le même temps, la chaîne vide sera la cause d'une conversion exception que brièvement tourbières dans l'INTERFACE utilisateur. Ces questions n'ont pas été suffisamment grave pour moi de chercher des solutions.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X