Як зробити так, щоб повзунок WPF був зроблений лише для дискретних цілих позицій?


114

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

Як це зробити у WPF, оскільки властивість Value на повзунку подвійна?

Відповіді:


95

Якщо встановити галочки правильно, ви можете використовувати IsSnapToTickEnabled . Це спрацювало досить добре для мене. Детальніше див. У MSDN .


172

Проста відповідь полягає в тому, що ви користуєтеся властивостями IsSnapToTickEnabled і TickFrequency . Тобто, увімкніть оснащення кліщами та встановіть частоту галочок на 1.

Або, інакше кажучи ... скористайтеся кліщами ... але вам не обов'язково показувати кліщів, до яких ви хапаєтеся.

Ознайомтесь із наступним твором xaml:

<Slider
    Orientation="Vertical"
    Height="200"
    Minimum="0"
    Maximum="10"
    Value="0"
    IsSnapToTickEnabled="True"
    TickFrequency="1"
/>

1
Ця відповідь має бути прийнятою. Працює як шарм. Спасибі
Ashbay

Дякую @Ashbay ... У той час я хотів дати комусь інший кредит за відповідь ... а не просто позначити власну відповідь як прийняту.
cplotts

Він знаходиться в розділі "Загальний" діалогового вікна "Властивості" в дизайнері, але, принаймні, на моїй машині це було не відразу видно, оскільки підрозділ "Розширений" було згорнуто і все занадто просто не помітити.
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, порожній рядок призведе до того, що буде викинуто виняток перетворення, яке ненадовго зменшить інтерфейс користувача. Ці питання не були досить серйозними для мене, щоб шукати рішення.


Так це дозволяє користувачеві мати й інші значення на повзунку? Або це все ще дозволяє лише вибрати значення кліщів. Начебто дивне запитання ... сподіваюся, ви зрозуміли, про що я питаю.
JLott

1
@JLott: Ви все ще можете прив’язатись до Ticksзначень (0, 10, 20, ...), але всі значення між ними (1, 2, ...) є дійсними і їх можна вибрати, наприклад, клавіші зі стрілками.
mkjeldsen

Ой акуратний. Я не усвідомлював цього ... Спасибі!
JLott

Це працює для Silverlight, де немає IsSnapToTickEnabledвласності.
ΩmegaMan
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.