Come si fa ad agganciare uno slider WPF solo a posizioni di interi discreti?


114

Troppo spesso voglio uno slider WPF che si comporti come il System.Windows.Forms.TrackBar di un tempo. Cioè, voglio un cursore che vada da X a Y ma che consenta all'utente di spostarlo solo in posizioni di numeri interi discreti.

Come si fa in WPF poiché la proprietà Value sullo Slider è doppia?

Risposte:


95

Se imposti i segni di graduazione nel modo giusto, puoi utilizzare IsSnapToTickEnabled . Questo ha funzionato abbastanza bene per me. Vedere MSDN per i dettagli.


172

La risposta semplice è che si sfruttano le proprietà IsSnapToTickEnabled e TickFrequency . Cioè, attiva lo snap ai tick e imposta la frequenza del tick su 1.

O, 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"
/>

1
Questa risposta dovrebbe essere quella accettata. Funziona come un fascino. Grazie
Ashbay

Grazie @ Ashbay ... in quel momento, volevo dare a qualcun altro il merito della risposta ... piuttosto che contrassegnare la mia risposta come accettata.
cplotts

Si trova nella sezione Comune della finestra di dialogo Proprietà in Designer, ma almeno sulla mia macchina non era immediatamente visibile perché la sottosezione Avanzate era compressa e fin troppo facile da trascurare.
amonroejj

46

Per coloro che vogliono agganciarsi a posizioni specifiche , puoi anche utilizzare la Ticksproprietà:

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

10

Il trucco dello snap è utile ma ha dei limiti, ad esempio se vuoi mostrare solo un sottoinsieme di tick validi. Ho avuto successo con due alternative: legare 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 di nessuno dei due si confrontino con il trucco istantaneo, ma non ho avuto problemi *.

* Se si associa anche il valore del cursore a un tipo di campo di testo, si verificherà che, ogni tanto, se si utilizza il mouse, il campo di testo mostrerà i decimali. Se si associa anche a un int allo stesso tempo, la stringa vuota causerà la generazione di un'eccezione di conversione che impantanerà brevemente l'interfaccia utente. Questi problemi non sono stati abbastanza gravi da permettermi di cercare soluzioni.


Quindi questo consente all'utente di avere anche gli altri valori sullo slider? Oppure consente ancora solo di scegliere il valore dei tick. Una domanda piuttosto strana ... spero che tu capisca cosa sto chiedendo.
JLott

1
@JLott: Puoi ancora agganciare solo ai Ticksvalori (0, 10, 20, ...) ma tutti i valori intermedi (1, 2, ...) sono validi e possono essere selezionati ad esempio con i tasti freccia.
mkjeldsen

Oh pulito. Non mi ero accorto che ... Grazie!
JLott

Questo funziona per Silverlight dove non sono presenti IsSnapToTickEnabledproprietà.
ΩmegaMan
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.