Страница карусели в Xamarin.Forms
CarouselPage в Xamarin.Forms — это страница, по которой пользователи могут проводить из стороны в сторону, чтобы переходить по страницам содержимого, например по страницам коллекции. В этой статье демонстрируется использование CarouselPage для перехода по коллекции страниц.
Внимание
CarouselPage
был заменен на CarouselView
, предоставляющий прокручиваемый макет, в котором пользователи могут перемещаться по коллекции элементов, проводя пальцем. Дополнительные сведения о CarouselView
см. в разделе Xamarin.Forms CarouselView.
На следующих снимках экрана показана страница CarouselPage
на каждой платформе.
Макет CarouselPage
одинаков на каждой платформе. По страницам можно переходить, проводя по экрану вправо для перехода вперед по коллекции или влево для перехода назад. На следующих снимках экрана показана первая страница в экземпляре CarouselPage
.
Если провести по экрану пальцем справа налево, будет выполнен переход ко второй странице, как показано на следующих снимках экрана.
Если провести по экрану пальцем справа налево еще раз, будет выполнен переход к третьей странице, а если провести слева направо, то вы вернетесь к предыдущей странице.
Примечание.
CarouselPage
не поддерживает виртуализацию пользовательского интерфейса. Поэтому, если CarouselPage
содержит слишком много дочерних элементов, производительность может снижаться.
Если объект CarouselPage
внедрен на страницу Detail
страницы FlyoutPage
, свойству FlyoutPage.IsGestureEnabled
необходимо присвоить значение false
, чтобы предотвратить конфликты жестов между CarouselPage
и FlyoutPage
.
Дополнительные сведения о CarouselPage
см. в главе 25 книги о Xamarin.Forms Чарльза Петцольда (Charles Petzold).
Создание CarouselPage
Создать CarouselPage
можно двумя способами:
- Заполните
CarouselPage
коллекцией дочерних экземпляровContentPage
. - Присвойте коллекцию свойству
ItemsSource
, а затем присвойтеDataTemplate
свойствуItemTemplate
, чтобы вернуть экземплярыContentPage
для объектов в коллекции.
Оба способа приводят к тому, что в CarouselPage
страницы будут отображаться по очереди. При проведении пальцем по экрану будет выполняться переход к следующей странице.
Примечание.
CarouselPage
можно заполнять только экземплярами ContentPage
или производными объектами ContentPage
.
Заполнение CarouselPage коллекцией страниц
В следующем примере кода XAML показан объект CarouselPage
, отображающий три экземпляра ContentPage
.
<CarouselPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="CarouselPageNavigation.MainPage">
<ContentPage>
<ContentPage.Padding>
<OnPlatform x:TypeArguments="Thickness">
<On Platform="iOS, Android" Value="0,40,0,0" />
</OnPlatform>
</ContentPage.Padding>
<StackLayout>
<Label Text="Red" FontSize="Medium" HorizontalOptions="Center" />
<BoxView Color="Red" WidthRequest="200" HeightRequest="200" HorizontalOptions="Center" VerticalOptions="CenterAndExpand" />
</StackLayout>
</ContentPage>
<ContentPage>
...
</ContentPage>
<ContentPage>
...
</ContentPage>
</CarouselPage>
В следующем примере кода показан эквивалентный пользовательский интерфейс на языке C#:
public class MainPageCS : CarouselPage
{
public MainPageCS ()
{
Thickness padding;
switch (Device.RuntimePlatform)
{
case Device.iOS:
case Device.Android:
padding = new Thickness(0, 40, 0, 0);
break;
default:
padding = new Thickness();
break;
}
var redContentPage = new ContentPage {
Padding = padding,
Content = new StackLayout {
Children = {
new Label {
Text = "Red",
FontSize = Device.GetNamedSize (NamedSize.Medium, typeof(Label)),
HorizontalOptions = LayoutOptions.Center
},
new BoxView {
Color = Color.Red,
WidthRequest = 200,
HeightRequest = 200,
HorizontalOptions = LayoutOptions.Center,
VerticalOptions = LayoutOptions.CenterAndExpand
}
}
}
};
var greenContentPage = new ContentPage {
Padding = padding,
Content = new StackLayout {
...
}
};
var blueContentPage = new ContentPage {
Padding = padding,
Content = new StackLayout {
...
}
};
Children.Add (redContentPage);
Children.Add (greenContentPage);
Children.Add (blueContentPage);
}
}
На каждой странице ContentPage
отображается элемент Label
для соответствующего цвета и элемент BoxView
этого цвета.
Заполнение CarouselPage с помощью шаблона
В следующем примере кода XAML показан объект CarouselPage
, сформированный путем присвоения DataTemplate
свойству ItemTemplate
для возврата страниц для объектов в коллекции:
<CarouselPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="CarouselPageNavigation.MainPage">
<CarouselPage.ItemTemplate>
<DataTemplate>
<ContentPage>
<ContentPage.Padding>
<OnPlatform x:TypeArguments="Thickness">
<On Platform="iOS, Android" Value="0,40,0,0" />
</OnPlatform>
</ContentPage.Padding>
<StackLayout>
<Label Text="{Binding Name}" FontSize="Medium" HorizontalOptions="Center" />
<BoxView Color="{Binding Color}" WidthRequest="200" HeightRequest="200" HorizontalOptions="Center" VerticalOptions="CenterAndExpand" />
</StackLayout>
</ContentPage>
</DataTemplate>
</CarouselPage.ItemTemplate>
</CarouselPage>
Объект CarouselPage
заполняется данными путем задания свойства ItemsSource
в конструкторе для файла кода программной части:
public MainPage ()
{
...
ItemsSource = ColorsDataModel.All;
}
В следующем примере кода создается эквивалентный объект CarouselPage
на языке C#:
public class MainPageCS : CarouselPage
{
public MainPageCS ()
{
Thickness padding;
switch (Device.RuntimePlatform)
{
case Device.iOS:
case Device.Android:
padding = new Thickness(0, 40, 0, 0);
break;
default:
padding = new Thickness();
break;
}
ItemTemplate = new DataTemplate (() => {
var nameLabel = new Label {
FontSize = Device.GetNamedSize (NamedSize.Medium, typeof(Label)),
HorizontalOptions = LayoutOptions.Center
};
nameLabel.SetBinding (Label.TextProperty, "Name");
var colorBoxView = new BoxView {
WidthRequest = 200,
HeightRequest = 200,
HorizontalOptions = LayoutOptions.Center,
VerticalOptions = LayoutOptions.CenterAndExpand
};
colorBoxView.SetBinding (BoxView.ColorProperty, "Color");
return new ContentPage {
Padding = padding,
Content = new StackLayout {
Children = {
nameLabel,
colorBoxView
}
}
};
});
ItemsSource = ColorsDataModel.All;
}
}
На каждой странице ContentPage
отображается элемент Label
для соответствующего цвета и элемент BoxView
этого цвета.