Как привязаться к значениям на слайдере WPF, но показывать галочку только для некоторых из них - PullRequest
9 голосов
/ 28 января 2010

У меня есть ползунок WPF, минимальное значение которого = 0, а максимальное = 50. Я хочу показывать тики с интервалом 5, но ползунок привязывать с интервалом 1. Возможно ли это?

Ответы [ 4 ]

10 голосов
/ 04 января 2011

Свойство Interval не влияет на это поведение.

Используйте это:

<Slider TickFrequency="5" IsSnapToTickEnabled="True" />
5 голосов
/ 18 апреля 2013
<Slider TickPlacement="TopLeft" Minimum="0" Maximum="50" TickFrequency="5" IsSnapToTickEnabled="False" SmallChange="1" />

Отключить привязку к тикам с помощью IsSnapToTickEnabled="False" и установить SmallChange="1".

SmallChange определяет приращение при перетаскивании большого пальца или нажатии клавиш со стрелками. Вы также можете контролировать приращение, когда пользователь нажимает на ползунок (не на большой палец). Чтобы сделать прыжок большим пальцем, используйте LargeChange="10", чтобы прыгнуть на 10 единиц. Чтобы переместить ползунок туда, где щелкнул пользователь, используйте IsMoveToPointEnabled="True". Обратите внимание, что IsMoveToPointEnabled поместит большой палец с ближайшим шагом SmallChange.

3 голосов
/ 03 сентября 2015

Обычный WPF Slider может рисовать только все галочки или вообще не рисовать.
Чтобы обойти это ограничение, вы можете либо создать свой собственный Slider, либо использовать трюк: отключите Slider TickBar и нарисуйте свой собственный.

<StackPanel>
    <TickBar Maximum="{Binding Path=Maximum, ElementName=MySlider}" 
        Minimum="{Binding Path=Minimum, ElementName=MySlider}" TickFrequency="5" Height="4"
        Fill="Black" ReservedSpace="11" />
    <Slider Name="MySlider" Maximum="50" TickPlacement="None" IsSnapToTickEnabled="True" />
</StackPanel>

ReservedSpace - это объединенное пространство слева и справа от большинства внешних отметок, которое точно равно ширине Thumb. Обычно это 11 пикселей. Если вы используете необычную тему или возитесь с ней по-другому, вам придется настроить ее и в новом TickBar.

У этого решения есть один недостаток: Thumb не будет заостренным, потому что Slider считает, что у него нет отметок. Если вы хотите, чтобы Thumb был острым, вам нужно обмануть Slider, дав ему TickBar, а затем свернуть его:

<StackPanel>
    <TickBar Maximum="{Binding Path=Maximum, ElementName=MySlider2}" 
        Minimum="{Binding Path=Minimum, ElementName=MySlider2}" TickFrequency="5"
        Height="4" Fill="Black" ReservedSpace="11" />
    <Slider Name="MySlider2" Maximum="50" TickPlacement="TopLeft"
        IsSnapToTickEnabled="True"/>
</StackPanel>

А затем в конструкторе Window (после InitializeComponent()):

this.Loaded += (sender, e) =>
{
    var sliderTickBar = (MySlider2.Template.FindName("TopTick", MySlider2) as 
        System.Windows.Controls.Primitives.TickBar);
    sliderTickBar.Visibility = Visibility.Collapsed;
};
1 голос
/ 18 мая 2017

Я решил ту же проблему, отображая только нужные тики, установив свойство Ticks, установив для IsSnapToTickEnabled значение false и используя округление в привязке значения слайдера. В моем примере я хочу показать слайдер от 0 до 100%, отображать тики с шагом 5% и шаг привязки до 1%.

XAML:

<Slider Minimum="0" Maximum="100"
    TickPlacement="BottomRight" Ticks="{Binding PercentTicks}" 
    TickFrequency="1" SmallChange="1" LargeChange="5"
    Value="{Binding MyProperty, Converter={StaticResource PercentageConverter}}" />

Модель просмотра:

    public double MyProperty
    {
        get { return myProperty; }
        set
        {
            myProperty = Math.Round(value, 2);
            OnPropertyChanged();
        }
    }

myProperty имеет значение от 0 до 1, поэтому округление до 2 цифр дает ровно 1% шаг! Установка тиков с шагом 5% выполняется в конструкторе модели представления:

var ticks = new DoubleCollection();
for (int i = 0; i <= 100; i+=5)
{
    ticks.Add(i);
}
PercentTicks = ticks;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...