Поделиться через


Шаговый переключатель

Пользовательский интерфейс многоплатформенного приложения .NET (.NET MAUI) Stepper позволяет выбрать числовое значение из диапазона значений. Он состоит из двух кнопок, помеченных знаками минуса и плюса. Эти кнопки можно управлять пользователем, чтобы постепенно выбрать double значение из диапазона значений.

Определяет Stepper четыре свойства типа double:

  • Increment — это сумма для изменения выбранного значения по умолчанию со значением 1.
  • Minimum — минимальное значение диапазона с значением по умолчанию 0.
  • Maximum — максимальное значение диапазона с значением по умолчанию 100.
  • Value — это значение шага, которое может варьироваться между Minimum и Maximum имеет значение по умолчанию 0.

Все эти свойства поддерживаются объектами BindableProperty . Свойство Value имеет режим BindingMode.TwoWayпривязки по умолчанию, что означает, что он подходит в качестве источника привязки в приложении, использующем шаблон Model-View-ViewModel (MVVM).

Принуживает Stepper Value свойство таким образом, чтобы оно было между Minimum и Maximum, включительно. Minimum Если для свойства задано значение, большее, чем Value свойство, Stepper задает Value значение Minimumсвойства. Аналогичным образом, если Maximum задано значение меньше Value, то Stepper свойство имеет значение Value Maximum. Внутри системы гарантирует, Stepper что Minimum меньше Maximum. Если Minimum или Maximum когда-либо заданы таким образом, что Minimum не меньше Maximum, возникает исключение. Дополнительные сведения о настройке Minimum и Maximum свойствах см. в разделе "Меры предосторожности".

StepperValueChanged определяет событие, возникающее при Value изменении, либо с помощью пользовательской манипуляции Stepper с этим свойством, либо при непосредственном установке Value свойства. Событие ValueChanged также возникает, когда Value свойство принудилось, как описано ранее. Объект ValueChangedEventArgs , который сопровождает ValueChanged событие, имеет OldValue и NewValueимеет тип double. Во время создания события значение совпадает со Value свойством NewValue Stepper объекта.

Создание шага

В следующем примере показано, как создать объект Stepperс двумя Label объектами:

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="StepperDemo.BasicStepperXAMLPage"
             Title="Basic Stepper XAML">
    <StackLayout Margin="20">
        <Label x:Name="_rotatingLabel"
               Text="ROTATING TEXT"
               FontSize="18"
               HorizontalOptions="Center"
               VerticalOptions="Center" />
        <Stepper Maximum="360"
                 Increment="30"
                 HorizontalOptions="Center"
                 ValueChanged="OnStepperValueChanged" />
        <Label x:Name="_displayLabel"
               Text="(uninitialized)"
               HorizontalOptions="Center"
               VerticalOptions="Center" />        
    </StackLayout>
</ContentPage>

В этом примере Stepper инициализировано Maximum свойство 360 и Increment свойство 30. Управление Stepper изменениями выбранного Increment значения увеличивается между Minimum Maximum значениями на основе значения свойства. Label Второй отображает текст "(неинициализировано)" до тех пор, пока не Stepper будет манипулировано, что приводит к возникновению первого ValueChanged события.

Файл программной части содержит обработчик события ValueChanged :

public partial class BasicStepperXAMLPage : ContentPage
{
    public BasicStepperXAMLPage()
    {
        InitializeComponent();
    }

    void OnStepperValueChanged(object sender, ValueChangedEventArgs e)
    {
        double value = e.NewValue;
        _rotatingLabel.Rotation = value;
        _displayLabel.Text = string.Format("The Stepper value is {0}", value);
    }
}

Обработчик ValueChanged Stepper объекта использует Value свойство объекта для задания свойства stepper первого и использует string.Format метод со NewValue свойством аргументов события, чтобы задать Text Rotation свойство второго Label Label:

.NET MAUI Stepper screenshot.

Кроме того, обработчик событий может получить Stepper событие с помощью аргумента sender . Свойство Value содержит текущее значение:

double value = ((Stepper)sender).Value;

Stepper Если объект был присвоен имя в XAML-файле с атрибутом x:Name (например, stepper), обработчик событий может ссылаться непосредственно на этот объект:

double value = stepper.Value;

Эквивалентный код C# для создания Stepper :

Stepper stepper = new Stepper
{
    Maximum = 360,
    Increment = 30,
    HorizontalOptions = LayoutOptions.Center
};
stepper.ValueChanged += (sender, e) =>
{
    rotationLabel.Rotation = stepper.Value;
    displayLabel.Text = string.Format("The Stepper value is {0}", e.NewValue);
};

Привязка данных к шагу

Обработчик ValueChanged событий можно устранить с помощью привязки данных для реагирования на Stepper изменение значения:

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="StepperDemo.BasicStepperBindingsPage"
             Title="Basic Stepper Bindings">
    <StackLayout Margin="20">
        <Label Text="ROTATING TEXT"
               Rotation="{Binding Source={x:Reference _stepper}, Path=Value}"
               FontSize="18"
               HorizontalOptions="Center"
               VerticalOptions="Center" />
        <Stepper x:Name="_stepper"
                 Maximum="360"
                 Increment="30"
                 HorizontalOptions="Center" />
        <Label Text="{Binding Source={x:Reference _stepper}, Path=Value, StringFormat='The Stepper value is {0:F0}'}"
               HorizontalOptions="Center"
               VerticalOptions="Center" />
    </StackLayout>
</ContentPage>

В этом примере Rotation свойство первого привязано к Value свойству Stepper, как Text и свойство второго Label Label со StringFormat спецификацией. При первом появлении страницы вторая Label отображает текстовую строку со значением. Чтобы отобразить текст без привязки данных, необходимо специально инициализировать Text свойство Label события или имитировать запуск ValueChanged события путем вызова обработчика событий из конструктора класса.

Меры предосторожности

Значение Minimum свойства всегда должно быть меньше значения Maximum свойства. В следующем примере кода возникает Stepper исключение:

// Throws an exception!
Stepper stepper = new Stepper
{
    Minimum = 180,
    Maximum = 360
};

Компилятор C# создает код, который задает эти два свойства в последовательности, и если Minimum свойство имеет значение 180, оно больше значения по умолчанию Maximum 100. Чтобы избежать исключения в этом случае, сначала задав Maximum свойство:

Stepper stepper = new Stepper
{
    Maximum = 360,
    Minimum = 180
};

В этом примере значение Maximum 360 не является проблемой, так как значение по умолчанию Minimum больше 0. Если Minimum задано, значение меньше Maximum 360.

Та же проблема существует в XAML. Задайте свойства в порядке, обеспечивающем, что Maximum всегда больше Minimum:

<Stepper Maximum="360"
         Minimum="180" ... />

Можно задать Minimum отрицательные числа и Maximum значения, но только в порядке, где Minimum всегда меньше Maximum:

<Stepper Minimum="-360"
         Maximum="-180" ... />

Свойство Value всегда больше или равно значению Minimum и меньше или равно Maximum. Если Value задано значение за пределами этого диапазона, значение будет принудиться к тому, чтобы лежать в диапазоне, но исключение не возникает. Например, этот код не вызывает исключение:

Stepper stepper = new Stepper
{
    Value = 180
};

Вместо этого Value свойство принудается к значению Maximum 100.

Предыдущий пример имеет Maximum значение 360 и Minimum 180:

Stepper stepper = new Stepper
{
    Maximum = 360,
    Minimum = 180
};

Если Minimum задано значение 180, то Value также задано значение 180.

ValueChanged Если обработчик событий был присоединен во время Value принудителя свойства к чему-либо, отличному от значения по умолчанию 0, ValueChanged создается событие:

<Stepper ValueChanged="OnStepperValueChanged"
         Maximum="360"
         Minimum="180" />

Если Minimum задано значение 180, Value также задано значение 180, а ValueChanged событие вызывается. Это может произойти до создания остальной части страницы, и обработчик может попытаться ссылаться на другие элементы на странице, которые еще не созданы. Может потребоваться добавить код в ValueChanged обработчик, который проверка для null значений других элементов на странице. Кроме того, можно задать ValueChanged обработчик событий после инициализации значений Stepper .