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

StackOverflow https://stackoverflow.com/questions/173009

  •  05-07-2019
  •  | 
  •  

Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top