Элементы управления ProgressBar
и Slider
в своей работе используют диапазоны значений и, несмотря на то, что эти элементы относятся к различным категориям, они имеют идентичные свойства так как имеют общего предка — класс RangeBase
. Рассмотрим работу этих элементов в приложении WPF.
Свойства класса RangeBase
Класс RangeBase
предоставляет нам следующие свойства для управления диапазонами значений в WPF:
Свойство | Тип | Описание |
SmallChange / LargeChange |
double |
Значение на которое изменяется текущее значение свойства Value |
Value |
double |
Текущее значение элемента |
Minimum / Maximum |
double |
Минимальное и максимальное значение элемента |
Также этот класс определяет событие
public event System.Windows.RoutedPropertyChangedEventHandler<double> ValueChanged;
которое генерируется при каждом изменении значения свойства Value
Стоит отметить, что, несмотря на то, что элемент управления ProgressBar
является наследником RangeBase
, этот элемент не использует свойства SmallChange
и LargeChange
.
Элемент Slider
Этот элемент управления позволяет пользователю выбирать одно из значений в диапазоне. С таким элементом управления мы сталкиваемся постоянно, например, при изменении уровня громкости в каком-либо приложении. У этого элемента управления в Windows 11 можно выделить следующие части:
Элемент Slider
предоставляет нам следующие свойства:
Свойство | Тип | Описание |
AutoToolTipPlacement |
AutoToolTipPlacement |
Определяет расположение подсказки, содержащей текущее значение элемента, когда зажат ползунок |
AutoToolTipPrecision |
int |
Количество знаков после запятой, которое содержит значение элемента в подсказке. |
Orientation |
Orientation |
Ориентация элемента (горизонтальная или вертикальная). По умолчанию, свойство имеет значение Horizontal |
Ticks |
DoubleCollection |
Задает коллекцию делений на шкале. По умолчанию равно null . |
TickFrequency |
double |
Расстояние между делениями шкалы. По умолчанию равно 1.0 |
TickPlacement |
TickPlacement |
Визуальное расположение делений шкалы. Значение по умолчанию — None (деления не показываются). Чтобы деления показывались, необходимо задать значение этого свойства отличное от None , а также задать значение свойству Foreground . |
IsSnapToTickEnabled |
bool |
Если значение равно true , то ползунок будет автоматически перемещаться к ближайшей метке |
IsSelectionRangeEnabled |
bool |
Указывает будет ли отображаться диапазон выбранных значений. Чтобы установить выделение диапазона выбранных значений, необходимо задать значения свойств SelectionStart и SelectionEnd |
IsMoveToPointEnabled |
bool |
Указывает будет ли ползунок автоматически перемещаться к месту на шкале по которому пользователь сделал щелчок мышью. Если значение равно False , то ползунок продвигается на одно деление за один клик. |
IsDirectionReversed |
bool |
Если свойство равно True , то увеличение значений шкалы идет справа налево. |
Рассмотрим применение этих свойств на следующем примере:
<Slider Minimum="0.0" Maximum="100.0" Orientation="Horizontal" IsMoveToPointEnabled="False" AutoToolTipPrecision="2" AutoToolTipPlacement="BottomRight" TickPlacement="Both" TickFrequency="5" IsSnapToTickEnabled="True" Foreground="Red"> </Slider>
В запущенном приложении мы увидим вот такой элемент Slider
:Здесь
Slider
использует диапазон значений от 0 до 10, а деления расположены каждые 5 единиц. При этом, свойство IsMoveToPointEnabled
равно False
, а IsSnapToTickEnabled
— True
, поэтому клик мышкой по шкале будет приводить к тому, что ползунок будет перемещаться к ближайшему делению шкалы:
В представленном примере метки на шкале расставлены равномерно. Используя свойство Ticks
, мы можем создать неравномерную шкалу Slider
, например, вот так:
<Slider Minimum="0.0" Maximum="100.0" Orientation="Horizontal" IsMoveToPointEnabled="False" AutoToolTipPrecision="2" AutoToolTipPlacement="BottomRight" TickPlacement="Both" Ticks="0, 1, 5, 10, 25, 50, 60.5, 70.8, 90.1, 100" TickFrequency="5" IsSnapToTickEnabled="True" Foreground="Red"> </Slider>
Теперь наш Slider
будет выглядеть вот так:
Если нам необходимо выделять диапазон значений на шкале Slider
, то мы можем использовать для этого событие ValueChanged
. Изменим создание Slider следующим образом:
<Slider Minimum="0.0" Maximum="100.0" Orientation="Horizontal" IsMoveToPointEnabled="False" AutoToolTipPrecision="2" AutoToolTipPlacement="BottomRight" TickPlacement="Both" Ticks="0, 1, 5, 10, 25, 50, 60.5, 70.8, 90.1, 100" TickFrequency="5" IsSnapToTickEnabled="True" Foreground="Red" x:Name="MySlider" IsSelectionRangeEnabled="True" ValueChanged="Slider_ValueChanged"> </Slider>
Здесь мы установили свойство IsSelectionRangeEnabled
, задали имя слайдера (MySlider
) и определили новый обработчик события ValueChanged
, который будет выглядеть вот так:
private void Slider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) { MySlider.SelectionStart = 0; MySlider.SelectionEnd = e.NewValue; }
Запустим приложение и посмотрим на результат:
Элемент ProgressBar
Элемент управления ProgressBar
обычно используется для показа пользователю прогресса выполнения какой-либо длительной операции. Например, ProgressBar используется для показа выполнения копирования большого объема данных, скачивания файлов из Сети и так далее. Соответственно, для управления отображением ProgressBar мы должны использовать код C#.
Элемент ProgressBar
предоставляет нам следующие свойства:
Свойство | Тип | Описание |
Orientation |
Orientation |
Ориентация элемента (горизонтальная или вертикальная). По умолчанию, свойство имеет значение Horizontal |
IsIndeterminate |
bool |
Если значение свойства равно True , то будет показываться «бесконечный» прогресс. Значение по умолчанию False |
Чтобы продемонстрировать работу ProgressBar
, воспользуемся уже имеющимся у нас приложением со Slider
и изменим XAML-код страницы следующим образом:
<StackPanel Margin="20"> <Slider Minimum="0.0" Maximum="100.0" Orientation="Horizontal" IsMoveToPointEnabled="False" AutoToolTipPrecision="2" AutoToolTipPlacement="BottomRight" TickPlacement="Both" Ticks="0, 1, 5, 10, 25, 50, 60.5, 70.8, 90.1, 100" TickFrequency="5" IsSnapToTickEnabled="True" Foreground="Red" x:Name="MySlider" IsSelectionRangeEnabled="True" ValueChanged="Slider_ValueChanged"> </Slider> <ProgressBar Minimum="0" Maximum="100" x:Name="MyProgress"/> </StackPanel>
Обработчик Slider_ValueChanged
изменим следующим образом:
private void Slider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) { MySlider.SelectionStart = 0; MySlider.SelectionEnd = e.NewValue; MyProgress.Value = e.NewValue; }
Теперь изменение Slider
будет менять состояние ProgressBar
:
«Бесконечный» ProgressBar будет выглядеть следующим образом:
<ProgressBar Minimum="0" Maximum="100" Height="10" x:Name="MyProgress" IsIndeterminate="True"/>
Как видно, при значении свойства IsIndeterminate
равным True
, изменение значение свойства Value
никак не влияет на визуальное состояние ProgressBar
.
Итого
Элементы управления Slider
и ProgressBar
в WPF имеют общего предка — класс RangeBase
, который позволяет пользователю работать с диапазонами значений. При этом, Slider
дает пользователю устанавливать значения диапазона, а ProgressBar
используется для отображения хода выполнения каких-либо длительных операций.