Bagaimana Anda membuat slider WPF hanya snap ke posisi integer diskrit?

114

Terlalu sering saya menginginkan slider WPF yang berperilaku seperti System.Windows.Forms.TrackBar yang lama. Artinya, saya ingin penggeser yang beralih dari X ke Y tetapi hanya memungkinkan pengguna untuk memindahkannya dalam posisi bilangan bulat terpisah.

Bagaimana seseorang melakukan ini di WPF karena properti Value pada Slider ganda?

cplotts
sumber

Jawaban:

95

Jika Anda menyetel tanda centang dengan cara yang benar, Anda dapat menggunakan IsSnapToTickEnabled . Ini bekerja cukup baik untuk saya. Lihat MSDN untuk detailnya.

Brian Stewart
sumber
172

Jawaban yang sederhana adalah bahwa Anda mengambil keuntungan dari IsSnapToTickEnabled dan TickFrequency properti. Yaitu, nyalakan gertakan menjadi kutu dan setel frekuensi centang ke 1.

Atau, dengan kata lain ... manfaatkan tanda centang ... tetapi Anda tidak harus menunjukkan tanda centang yang Anda bidik.

Lihat potongan xaml berikut:

<Slider
    Orientation="Vertical"
    Height="200"
    Minimum="0"
    Maximum="10"
    Value="0"
    IsSnapToTickEnabled="True"
    TickFrequency="1"
/>
cplotts
sumber
1
Jawaban ini harus menjadi jawaban yang diterima. Bekerja seperti pesona. Terima kasih
Ashbay
Terima kasih @Ashbay ... pada saat itu, saya ingin memberi penghargaan kepada orang lain atas jawabannya ... daripada hanya menandai jawaban saya sendiri sebagai diterima.
cplotts
Ini berada di bawah bagian Common dari dialog Properties di designer, tetapi di mesin saya, setidaknya, itu tidak langsung terlihat karena sub-bagian Advanced diciutkan dan terlalu mudah untuk diabaikan.
amonroejj
46

Bagi mereka yang ingin mengambil posisi tertentu , Anda juga dapat menggunakan Ticksproperti:

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

Trik snap berguna tetapi memiliki batasan, misalnya jika Anda hanya ingin menampilkan subset dari tick yang valid. Saya telah sukses dengan dua alternatif: mengikat ke integer atau membulatkan nilai baru. Berikut adalah contoh gabungannya:

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

Saya tidak tahu bagaimana kinerja keduanya dibandingkan dengan trik jepret tetapi saya tidak mengalami masalah *.

* Jika Anda juga mengikat nilai slider ke jenis bidang teks, Anda akan mengalami hal itu, sesekali jika menggunakan mouse, bidang teks akan menampilkan desimal. Jika Anda juga mengikat ke int pada saat yang sama, string kosong akan menyebabkan pengecualian konversi dilemparkan yang secara singkat menghambat UI. Masalah ini belum cukup parah bagi saya untuk mencari solusinya.

mkjeldsen.dll
sumber
Jadi apakah ini memungkinkan pengguna untuk juga memiliki nilai lain di bilah geser? Atau apakah itu masih hanya memungkinkan nilai kutu yang akan dipilih. Jenis pertanyaan yang aneh ... semoga Anda mengerti apa yang saya tanyakan.
JLott
1
@ JLott: Anda masih dapat hanya mengambil Ticksnilai (0, 10, 20, ...) tetapi semua nilai di antara (1, 2, ...) adalah valid dan dapat dipilih dengan misalnya tombol panah.
mkjeldsen
Oh rapi. Saya tidak menyadarinya ... Terima kasih!
JLott
Ini berfungsi untuk Silverlight di mana tidak ada IsSnapToTickEnabledproperti.
ΩmegaMan