Элементы управления в WPF. ProgressBar и Slider

Элементы управления 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 WPF

Элемент 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 WPFЗдесь Slider использует диапазон значений от 0 до 10, а деления расположены каждые 5 единиц. При этом, свойство IsMoveToPointEnabled равно False, а IsSnapToTickEnabledTrue, поэтому клик мышкой по шкале будет приводить к тому, что ползунок будет перемещаться к ближайшему делению шкалы:

slider wpf

В представленном примере метки на шкале расставлены равномерно. Используя свойство 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 WPF

Если нам необходимо выделять диапазон значений на шкале 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;
}

Запустим приложение и посмотрим на результат:

slider wpf

Элемент 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 wpf

«Бесконечный» ProgressBar будет выглядеть следующим образом:

<ProgressBar Minimum="0" 
             Maximum="100"
             Height="10"
             x:Name="MyProgress" 
             IsIndeterminate="True"/>

 

ProgressBar wpf

Как видно, при значении свойства IsIndeterminate равным True, изменение значение свойства Value никак не влияет на визуальное состояние ProgressBar.

Итого

Элементы управления Slider и ProgressBar в WPF имеют общего предка — класс RangeBase, который позволяет пользователю работать с диапазонами значений. При этом, Slider дает пользователю устанавливать значения диапазона, а ProgressBar используется для отображения хода выполнения каких-либо длительных операций.

 

Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии