Как сделать слайдер WPF только для дискретных целых позиций?

Слишком часто мне нужен слайдер WPF, который ведет себя как старый System.Windows.Forms.TrackBar. То есть, мне нужен слайдер, идущий от X до Y, но только позволяющий пользователю перемещать его в дискретных целочисленных позициях.

Как это сделать в WPF, поскольку свойство Value на слайдере двойное?

Ответ 1

Если вы установили свои метки в правильном порядке, вы можете использовать IsSnapToTickEnabled. Это работало очень хорошо для меня. Подробнее см. MSDN.

Ответ 2

Простой ответ заключается в том, что вы используете свойства IsSnapToTickEnabled и TickFrequency. То есть, включите привязку к тикам и установите частоту тика на 1.

Или, другими словами... воспользуйтесь тиками... но вам необязательно показывать тики, которые вы привязываете.

Посмотрите следующий фрагмент xaml:

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

Ответ 3

Для тех, кто хочет привязать к определенным позициям, вы также можете использовать свойство Ticks:

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

Ответ 4

Уловка удобно, но имеет ограничения, например, если вы хотите показывать только подмножество действительных тиков. У меня был успех с двумя альтернативами: либо привязать к целому числу, либо обойти новое значение. Вот комбинированный пример:

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

Я понятия не имею, как производительность либо сравнивается с трюком, но у меня не было проблем *.

* Если вы также привязываете значение ползунка к типу текстового поля, вы будете испытывать это, каждый раз в то время, используя мышь, текстовое поле будет показывать десятичные числа. Если вы также привязываетесь к int в то же время, пустая строка вызовет исключение преобразования, которое вкратце приведет к сбою интерфейса. Эти проблемы не были достаточно серьезными, чтобы я мог искать решения.