Как сделать так, чтобы слайдер WPF привязывался только к дискретным целым позициям? - PullRequest
105 голосов
/ 06 октября 2008

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

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

Ответы [ 4 ]

160 голосов
/ 06 октября 2008

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

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

Проверьте следующий кусок xaml:

<Slider
    Orientation="Vertical"
    Height="200"
    Minimum="0"
    Maximum="10"
    Value="0"
    IsSnapToTickEnabled="True"
    TickFrequency="1"
/>
90 голосов
/ 06 октября 2008

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

44 голосов
/ 14 августа 2011

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

<Slider Minimum="1" Maximum="500" IsSnapToTickEnabled="True" Ticks="1,100,200,350,500" />
9 голосов
/ 20 декабря 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...