Как сделать слайдер WPF только для дискретных целых позиций? - программирование
Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 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 в то же время, пустая строка вызовет исключение преобразования, которое вкратце приведет к сбою интерфейса. Эти проблемы не были достаточно серьезными, чтобы я мог искать решения.