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


Xamarin.Forms Шагового

Используйте шаг для выбора числового значения из диапазона значений.

Состоит Xamarin.FormsStepper из двух кнопок, помеченных знаками минуса и плюса. Эти кнопки можно управлять пользователем, чтобы постепенно выбрать double значение из диапазона значений.

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

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

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

Предупреждение

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

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

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

ОбъектValueChangedEventArgs, сопровождающий ValueChanged событие, имеет два свойства: и NewValueтипdoubleOldValue. Во время запуска события значение NewValue совпадает со Value свойством Stepper объекта.

Базовый код пошагового шага и разметка

Пример содержит три страницы, которые функционально идентичны, но реализуются разными способами. Первая страница использует только код C#, второй использует XAML с обработчиком событий в коде, а третий способен избежать обработчика событий с помощью привязки данных в XAML-файле.

Создание пошагового шага в коде

На странице "Базовый шаг- код" в примере показано, как создать Stepper и два Label объекта в коде:

public class BasicStepperCodePage : ContentPage
{
    public BasicStepperCodePage()
    {
        Label rotationLabel = new Label
        {
            Text = "ROTATING TEXT",
            FontSize = Device.GetNamedSize(NamedSize.Large, typeof(Label)),
            HorizontalOptions = LayoutOptions.Center,
            VerticalOptions = LayoutOptions.CenterAndExpand
        };

        Label displayLabel = new Label
        {
            Text = "(uninitialized)",
            HorizontalOptions = LayoutOptions.Center,
            VerticalOptions = LayoutOptions.CenterAndExpand
        };

        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);
        };

        Title = "Basic Stepper Code";
        Content = new StackLayout
        {
            Margin = new Thickness(20),
            Children = { rotationLabel, stepper, displayLabel }
        };
    }
}

Инициализировано Stepper свойство Maximum 360 и Increment свойство 30. Управление Stepper изменениями выбранного Increment значения увеличивается между Minimum Maximum значениями на основе значения свойства. Обработчик ValueChanged Stepper объекта использует Value свойство stepper объекта для задания Rotation свойства первого Label и использует string.Format метод со NewValue свойством аргументов события для задания Text свойства второго Label. Эти два подхода для получения текущего Stepper значения являются взаимозаменяемыми.

На следующих снимках экрана показана страница "Базовый код шагера ".

Базовый код шагера

Label Второй отображает текст "(неинициализированный)" до тех пор, пока не Stepper будет манипулировано, что приводит к тому, что первое ValueChanged событие будет запущено.

Создание пошагового шага в XAML

Страница XAML "Базовый шаг" функционально аналогична базовому коду шагера, но реализована в основном в XAML:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             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="Large"
               HorizontalOptions="Center"
               VerticalOptions="CenterAndExpand" />
        <Stepper Maximum="360"
                 Increment="30"
                 HorizontalOptions="Center"
                 ValueChanged="OnStepperValueChanged" />
        <Label x:Name="_displayLabel"
               Text="(uninitialized)"
               HorizontalOptions="Center"
               VerticalOptions="CenterAndExpand" />        
    </StackLayout>
</ContentPage>

Файл программной части содержит обработчик события 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);
    }
}

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

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

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

double value = stepper.Value;

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

На странице "Базовые привязки шагов" показано, как создать почти эквивалентное приложение, которое устраняет Value обработчик событий с помощью привязки данных:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             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="Large"
               HorizontalOptions="Center"
               VerticalOptions="CenterAndExpand" />
        <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="CenterAndExpand" />
    </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.

Ниже приведен фрагмент кода, показанный выше:

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

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

ValueChanged Если обработчик событий был присоединен в то время, когда Value свойство принудается к чему-либо, отличному от его значения по умолчанию 0, ValueChanged то событие запускается. Ниже приведен фрагмент КОДА XAML:

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

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