Slider и ProgressBar

82

В WPF имеются три элемента управления, использующих концепцию диапазонов (range). Такие элементы принимают числовое значение, которое находится в диапазоне между заданными минимальным и максимальным значениями. Эти элементы управления — ScrollBar, ProgressBar и Slider — порождены от класса RangeBase (который является наследником класса Control). Но хотя они используют одну и ту же абстракцию (диапазон), работают они по-разному.

Класс RangeBase определяет свойства, перечисленные ниже:

Value

Текущее значение элемента управления (которое должно находиться между минимумом и максимумом). По умолчанию оно начинается с 0. Обратите внимание: значение Value не является целочисленным — оно имеет тип double, т.е. может иметь дробные значения. Если нужно получать уведомления об изменении значения, можно реагировать на событие ValueChanged.

Maximum

Верхний предел (максимальное допустимое значение)

Minimum

Нижний предел (минимальное допустимое значение)

SmallChange

Величина, на которую уменьшается или увеличивается значение свойства Value при "малом изменении". Смысл малого изменения зависит от элемента управления (и может вообще не использоваться). Для элементов ScrollBar и Slider это величина изменения значения при нажатиях клавиш управления курсором. Для элемента ScrollBar для этого можно применять кнопки со стрелочками на концах полосы прокрутки.

LargeChange

Величина, на которую уменьшается или увеличивается значение свойства Value при "большом изменении". Смысл большого изменения зависит от элемента управления (и может вообще не использоваться). Для элементов управления ScrollBar и Slider это величина изменения значения при нажатиях клавиш <PageUp> и <PаgeDown> или при щелчках на полосе с любой стороны ползунка (который указывает текущую позицию).

Как правило, элемент управления ScrollBar не используется непосредственно. Чаще применяется элемент управления более высокого уровня ScrollViewer, который объединяет два элемента ScrollBar. Более удобными и зачастую более полезными являются Slider и ProgressBar.

Класс Slider

Класс Slider (ползунок) является специализированным элементом управления, который часто бывает очень полезным. Им можно воспользоваться для задания числовых значений в тех ситуациях, когда само число не особенно важно. Например, громкость в проигрывателе лучше всего устанавливать, сдвигая ползунок на линейке. Позиция ползунка показывает относительную громкость (нормально, тихо, громко), а представляющее ее число не представляет особого смысла для пользователя.

Ключевые свойства класса Slider определены в классе RangeBase. Кроме них, можно использовать все свойства, перечисленные в таблице:

Свойства класса Slider
Orientation Устанавливает вертикальную или горизонтальную ориентацию элемента
Delay, Interval Управляет скоростью перемещения ползунка вдоль линейки, когда пользователь щелкает и удерживает нажатой клавишу мыши с любой стороны ползунка. Оба значения задаются в миллисекундах. Delay — это время, по истечении которого ползунок переместится на одну единицу (малое изменение) после щелчка, a Interval — время, после которого он продолжит перемещение, если удерживать прижатой кнопку мыши.
TickPlacement Определяет размещение отметок возле линейки, которые помогают визуализировать шкалу. По умолчанию свойство TickPlacement имеет значение None, и отметки не отображаются. При горизонтальной ориентации отметки можно поместить над линейкой (TopLeft) или под ней (BottomRight), а при вертикальной — слева (TopLeft) или справа (BottomRight). (Имена для свойства TickPlacement могут запутать, т.к. два значения используются для четырех вариантов расположения отметок.)
TickFrequency Задает интервал между отметками, определяя их количество. Например, их можно помещать через каждые 5 числовых единиц, каждые 10 и т.д.
Ticks Используется для помещения отметок в нерегулярных позициях. Просто добавьте в эту коллекцию по одному числу (типа double) для каждой отметки. Например, можно поместить отметки в позиции 1, 1.5, 2 и 10 на линейке, добавив эти числа.
IsSnapToTickEnabled Если равно true, то при перемещении ползунка он автоматически перепрыгивает к ближайшей отметке. По умолчанию это свойство равно false.
IsSelectionRangeEnabled Если равно true, можно использовать числовой диапазон для затенения участка линейки прокрутки. Этот диапазон задается свойствами SelectionStart и SelectionEnd. Сам по себе диапазон выбора не имеет значения, но его можно использовать для произвольных целей. Например, в проигрывателях затенение линейки иногда используется, чтобы показать процесс загрузки файла

Ниже показано несколько примеров слайдеров:

<StackPanel Margin="5">
            <Label>Slider: Max = 100, Val = 15</Label>
            <Slider Maximum="100" Minimum="1" Value="15"></Slider>
        </StackPanel>
        <StackPanel Margin="5" Grid.Row="1">
            <Label>Slider: TickFrequency=10, TickPlacement=BottomRight</Label>
            <Slider Maximum="100" Minimum="1" Value="15" TickFrequency="10"
                    TickPlacement="BottomRight"></Slider>
        </StackPanel>
        <StackPanel Margin="5" Grid.Row="2">
            <Label>Slider: Ticks (1,2,4,8,16,32,100)</Label>
            <Slider Maximum="100" Minimum="1" Value="15" TickFrequency="10"
                    TickPlacement="BottomRight" Ticks="1,2,4,8,16,32,100"></Slider>
        </StackPanel>
        <StackPanel Margin="5" Grid.Row="3">
            <Label>Slider: IsSelectionRangeEnabled="True" SelectionStart="10" SelectionEnd="60"</Label>
            <Slider Maximum="100" Minimum="1" Value="15" TickFrequency="10"
                    TickPlacement="BottomRight" IsSelectionRangeEnabled="True"
                    SelectionStart="10" SelectionEnd="60"></Slider>
</StackPanel>
Slider

Класс ProgressBar

Элемент управления ProgressBar (индикатор прогресса) показывает ход выполнения длительной задачи. В отличие от движка, ProgressBar не является интерактивным элементом управления. Наоборот, за периодическое изменение значения свойства Value отвечает исключительно ваш код. (Строго говоря, по правилам WPF ProgressBar не должен считаться элементом управления, поскольку он не реагирует на действия мыши или ввод с клавиатуры.)

Минимальная высота элементов ProgressBar равна четырем не зависящим от устройства единицам. Вы должны самостоятельно установить свойство Height (или поместить его в подходящий контейнер с фиксированными размерами), если хотите видеть большую полосу более традиционного вида.

Элемент ProgressBar можно использовать для отображения "долгоиграющего" индикатора состояния, когда неизвестно, как долго будет длиться задача. Интересно (и странно), что для этого нужно присвоить свойству IsIndeterminate значение true:

<ProgressBar Height="18" Width="200" IsIndeterminate="True">
</ProgressBar>

После установки IsIndeterminate свойства Minimum, Maximum и Value уже не нужны, т.к. индикатор прогресса будет показывать периодический зеленый импульс, двигающийся слева направо — универсальное в среде Windows указание на выполнение какой-либо задачи. Эту разновидность индикатора удобно применять в строке состояния приложения, например, чтобы показать, что выполняется соединение с удаленным сервером для передачи информации.

ProgressBar
Пройди тесты
Лучший чат для C# программистов