Ответ 1
Если вы установили свои метки в правильном порядке, вы можете использовать IsSnapToTickEnabled. Это работало очень хорошо для меня. Подробнее см. MSDN.
Слишком часто мне нужен слайдер WPF, который ведет себя как старый System.Windows.Forms.TrackBar. То есть, мне нужен слайдер, идущий от X до Y, но только позволяющий пользователю перемещать его в дискретных целочисленных позициях.
Как это сделать в WPF, поскольку свойство Value на слайдере двойное?
Если вы установили свои метки в правильном порядке, вы можете использовать IsSnapToTickEnabled. Это работало очень хорошо для меня. Подробнее см. MSDN.
Простой ответ заключается в том, что вы используете свойства IsSnapToTickEnabled и TickFrequency. То есть, включите привязку к тикам и установите частоту тика на 1.
Или, другими словами... воспользуйтесь тиками... но вам необязательно показывать тики, которые вы привязываете.
Посмотрите следующий фрагмент xaml:
<Slider
Orientation="Vertical"
Height="200"
Minimum="0"
Maximum="10"
Value="0"
IsSnapToTickEnabled="True"
TickFrequency="1"
/>
Для тех, кто хочет привязать к определенным позициям, вы также можете использовать свойство Ticks
:
<Slider Minimum="1" Maximum="500" IsSnapToTickEnabled="True" Ticks="1,100,200,350,500" />
Уловка удобно, но имеет ограничения, например, если вы хотите показывать только подмножество действительных тиков. У меня был успех с двумя альтернативами: либо привязать к целому числу, либо обойти новое значение. Вот комбинированный пример:
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 в то же время, пустая строка вызовет исключение преобразования, которое вкратце приведет к сбою интерфейса. Эти проблемы не были достаточно серьезными, чтобы я мог искать решения.