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