Come si fa a far scattare uno slider WPF solo su posizioni intere discrete?
Domanda
Troppo spesso voglio uno slider WPF che si comporti come il vecchio System.Windows.Forms.TrackBar. Cioè, voglio un dispositivo di scorrimento che va da X a Y ma consente solo all'utente di spostarlo in posizioni intere discrete.
Come si fa in WPF poiché la proprietà Value sullo Slider è doppia?
Soluzione
Se imposti i segni di spunta nel modo giusto, puoi utilizzare IsSnapToTickEnabled . Questo ha funzionato abbastanza bene per me. Vedi MSDN per i dettagli.
Altri suggerimenti
La semplice risposta è che sfrutti le proprietà IsSnapToTickEnabled e TickFrequency . Cioè, attiva lo scatto in tick e imposta la frequenza di tick su 1.
In altre parole ... approfitta delle zecche ... ma non devi necessariamente mostrare le zecche a cui stai scattando.
Dai un'occhiata al seguente pezzo di xaml:
<Slider
Orientation="Vertical"
Height="200"
Minimum="0"
Maximum="10"
Value="0"
IsSnapToTickEnabled="True"
TickFrequency="1"
/>
Per coloro che vogliono agganciarsi a specifiche posizioni, puoi anche usare la proprietà Ticks
:
<Slider Minimum="1" Maximum="500" IsSnapToTickEnabled="True" Ticks="1,100,200,350,500" />
Il trucco è pratico ma presenta delle limitazioni, ad esempio se si desidera mostrare solo un sottoinsieme di tick validi. Ho avuto successo con due alternative: o associare a un numero intero o arrotondare il nuovo valore. Ecco un esempio combinato:
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"/>
Non ho idea di come le prestazioni siano paragonabili a quelle del trucco, ma non ho avuto problemi *.
* Se anche associ il valore del dispositivo di scorrimento a un tipo di campo di testo, sperimenterai che, ogni tanto se usi il mouse, il campo di testo mostrerà i decimali. Se si associa anche a un int allo stesso tempo, la stringa vuota provocherà un'eccezione di conversione che blocca brevemente l'interfaccia utente. Questi problemi non sono stati abbastanza gravi per me cercare soluzioni.