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

114

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

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

cplotts
источник

Ответы:

95

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

Брайан Стюарт
источник
172

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

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

Обратите внимание на следующий фрагмент xaml:

<Slider
    Orientation="Vertical"
    Height="200"
    Minimum="0"
    Maximum="10"
    Value="0"
    IsSnapToTickEnabled="True"
    TickFrequency="1"
/>
cplotts
источник
1
Этот ответ должен быть принятым. Работает как шарм. Спасибо
Ashbay
Спасибо @Ashbay ... в то время я хотел отдать должное кому-то другому ... вместо того, чтобы просто пометить свой ответ как принятый.
график
Он находится в разделе «Общие» диалогового окна «Свойства» в конструкторе, но, по крайней мере, на моем компьютере он не сразу был виден, потому что подраздел «Дополнительно» был свернут, и его слишком легко не заметить.
amonroejj
46

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

<Slider Minimum="1" Maximum="500" IsSnapToTickEnabled="True" Ticks="1,100,200,350,500" />
Дэйв
источник
10

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

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

mkjeldsen
источник
Так позволяет ли это пользователю иметь другие значения на слайдере? Или он по-прежнему позволяет выбирать только значение тиков. Странный вопрос ... надеюсь, вы понимаете, о чем я спрашиваю.
JLott
1
@JLott: Вы по-прежнему можете привязываться только к Ticksзначениям (0, 10, 20, ...), но все значения между ними (1, 2, ...) действительны и могут быть выбраны, например, клавишами со стрелками.
mkjeldsen
Ой, аккуратно. Я этого не осознавал ... Спасибо!
JLott
Это работает для Silverlight, где нет IsSnapToTickEnabledсвойства.
ΩmegaMan