Partilhar via


Xamarin.Forms CarrosselExibir layout

CarouselView Define as seguintes propriedades que controlam o layout:

  • ItemsLayout, do tipo LinearItemsLayout, especifica o layout a ser usado.
  • PeekAreaInsets, do tipo Thickness, especifica a quantidade de itens adjacentes parcialmente visíveis.

Essas propriedades são apoiadas por objetos BindableProperty, o que significa que as propriedades podem ser alvos de vinculações de dados.

Por padrão, um CarouselView exibirá seus itens em uma orientação horizontal. Um único item será exibido na tela, e os gestos de passar o dedo resultarão em navegação para frente e para trás na coleção de itens. Entretanto, uma orientação vertical também é possível. Isso ocorre porque a propriedade ItemsLayout é do tipo LinearItemsLayout, que herda da classe ItemsLayout. A classe ItemsLayout define as seguintes propriedades:

Essas propriedades são apoiadas por objetos BindableProperty, o que significa que as propriedades podem ser alvos de vinculações de dados. Para obter mais informações sobre pontos de ajuste, consulte Pontos de ajuste no Xamarin.Forms guia de rolagem CollectionView.

A enumeração ItemsLayoutOrientation define os seguintes membros:

  • Vertical indica que o CarouselView se expandirá verticalmente à medida que os itens forem adicionados.
  • Horizontal indica que o CarouselView se expandirá horizontalmente à medida que os itens forem adicionados.

A classe LinearItemsLayout herda da classe ItemsLayout e define uma propriedade ItemSpacing, do tipo double, que representa o espaço vazio ao redor de cada item. O valor padrão dessa propriedade é 0 e seu valor deve ser sempre maior ou igual a 0. A classe LinearItemsLayout também define Vertical estáticos e membros Horizontal. Esses membros podem ser usados para criar listas verticais ou horizontais, respectivamente. Como alternativa, um objeto LinearItemsLayout pode ser criado, especificando um membro da enumeração ItemsLayoutOrientation como argumento.

Observação

CarouselView usa os mecanismos de layout nativos para executar o layout.

Layout horizontal

Por padrão, CarouselView exibirá seus itens horizontalmente. Portanto, não é necessário definir a propriedade ItemsLayout para usar esse layout:

<CarouselView ItemsSource="{Binding Monkeys}">
    <CarouselView.ItemTemplate>
        <DataTemplate>
            <StackLayout>
                <Frame HasShadow="True"
                       BorderColor="DarkGray"
                       CornerRadius="5"
                       Margin="20"
                       HeightRequest="300"
                       HorizontalOptions="Center"
                       VerticalOptions="CenterAndExpand">
                    <StackLayout>
                        <Label Text="{Binding Name}"
                               FontAttributes="Bold"
                               FontSize="Large"
                               HorizontalOptions="Center"
                               VerticalOptions="Center" />
                        <Image Source="{Binding ImageUrl}"
                               Aspect="AspectFill"
                               HeightRequest="150"
                               WidthRequest="150"
                               HorizontalOptions="Center" />
                        <Label Text="{Binding Location}"
                               HorizontalOptions="Center" />
                        <Label Text="{Binding Details}"
                               FontAttributes="Italic"
                               HorizontalOptions="Center"
                               MaxLines="5"
                               LineBreakMode="TailTruncation" />
                    </StackLayout>
                </Frame>
            </StackLayout>
        </DataTemplate>
    </CarouselView.ItemTemplate>
</CarouselView>

Como alternativa, esse layout também pode ser obtido definindo a propriedade ItemsLayout para um objeto LinearItemsLayout, especificando o membro da enumeração Horizontal ItemsLayoutOrientation como o valor da propriedade Orientation:

<CarouselView ItemsSource="{Binding Monkeys}">
    <CarouselView.ItemsLayout>
        <LinearItemsLayout Orientation="Horizontal" />
    </CarouselView.ItemsLayout>
    ...
</CarouselView>

Este é o código C# equivalente:

CarouselView carouselView = new CarouselView
{
    ...
    ItemsLayout = LinearItemsLayout.Horizontal
};

Isso resulta em um layout que cresce horizontalmente à medida que novos itens são adicionados:

Captura de tela de um layout horizontal do CarouselView, no iOS e Android

Layout vertical

CarouselView pode exibir seus itens verticalmente definindo a propriedade ItemsLayout como um objeto LinearItemsLayout, especificando o membro da enumeração Vertical ItemsLayoutOrientation como o valor da propriedade Orientation:

<CarouselView ItemsSource="{Binding Monkeys}">
    <CarouselView.ItemsLayout>
        <LinearItemsLayout Orientation="Vertical" />
    </CarouselView.ItemsLayout>
    <CarouselView.ItemTemplate>
        <DataTemplate>
            <StackLayout>
                <Frame HasShadow="True"
                       BorderColor="DarkGray"
                       CornerRadius="5"
                       Margin="20"
                       HeightRequest="300"
                       HorizontalOptions="Center"
                       VerticalOptions="CenterAndExpand">
                    <StackLayout>
                        <Label Text="{Binding Name}"
                               FontAttributes="Bold"
                               FontSize="Large"
                               HorizontalOptions="Center"
                               VerticalOptions="Center" />
                        <Image Source="{Binding ImageUrl}"
                               Aspect="AspectFill"
                               HeightRequest="150"
                               WidthRequest="150"
                               HorizontalOptions="Center" />
                        <Label Text="{Binding Location}"
                               HorizontalOptions="Center" />
                        <Label Text="{Binding Details}"
                               FontAttributes="Italic"
                               HorizontalOptions="Center"
                               MaxLines="5"
                               LineBreakMode="TailTruncation" />
                    </StackLayout>
                </Frame>
            </StackLayout>
        </DataTemplate>
    </CarouselView.ItemTemplate>
</CarouselView>

Este é o código C# equivalente:

CarouselView carouselView = new CarouselView
{
    ...
    ItemsLayout = LinearItemsLayout.Vertical
};

Isso resulta em um layout que cresce verticalmente à medida que novos itens são adicionados:

Captura de tela de um layout vertical do CarouselView, no iOS e Android

Itens adjacentes parcialmente visíveis

Por padrão, CarouselView exibe todos os itens de uma só vez. No entanto, esse comportamento pode ser alterado definindo-se a propriedade PeekAreaInsets como um valor Thickness que especifica a quantidade de itens adjacentes parcialmente visíveis. Isso pode ser útil para indicar aos usuários que há itens adicionais a serem exibidos. O XAML a seguir mostra um exemplo de configuração dessa propriedade:

<CarouselView ItemsSource="{Binding Monkeys}"
              PeekAreaInsets="100">
    ...
</CarouselView>

Este é o código C# equivalente:

CarouselView carouselView = new CarouselView
{
    ...
    PeekAreaInsets = new Thickness(100)
};

O resultado é que os itens adjacentes são parcialmente expostos na tela:

Captura de tela de um CollectionView com itens adjacentes parcialmente visíveis, no iOS e no Android

Espaçamento entre itens

Por padrão, não há espaço entre cada item em um CarouselView. Esse comportamento pode ser alterado com a definição da propriedade ItemSpacing no layout de itens usado pelo CarouselView.

Quando um CarouselView define sua propriedade ItemsLayout como um objeto LinearItemsLayout, a propriedade LinearItemsLayout.ItemSpacing pode ser definida como um valor double que representa o espaço entre os itens:

<CarouselView ItemsSource="{Binding Monkeys}">
    <CarouselView.ItemsLayout>
        <LinearItemsLayout Orientation="Vertical"
                           ItemSpacing="20" />
    </CarouselView.ItemsLayout>
    ...
</CarouselView>

Observação

A propriedade LinearItemsLayout.ItemSpacing tem um conjunto de retorno de chamada de validação, o que garante que o valor da propriedade seja sempre maior ou igual a 0.

Este é o código C# equivalente:

CarouselView carouselView = new CarouselView
{
    ...
    ItemsLayout = new LinearItemsLayout(ItemsLayoutOrientation.Vertical)
    {
        ItemSpacing = 20
    }
};

Esse código resulta em um layout vertical, que tem um espaçamento de 20 entre os itens.

Redimensionamento dinâmico de itens

Os itens em um CarouselView podem ser redimensionados dinamicamente no runtime, alterando as propriedades relacionadas ao layout dos elementos dentro do DataTemplate. Por exemplo, o exemplo de código a seguir altera as propriedades HeightRequest e WidthRequest de um objeto Image e a propriedade HeightRequest de seu objeto pai Frame:

void OnImageTapped(object sender, EventArgs e)
{
    Image image = sender as Image;
    image.HeightRequest = image.WidthRequest = image.HeightRequest.Equals(150) ? 200 : 150;
    Frame frame = ((Frame)image.Parent.Parent);
    frame.HeightRequest = frame.HeightRequest.Equals(300) ? 350 : 300;
}

O OnImageTapped manipulador de eventos é executado em resposta a um Image objeto que está sendo tocado e altera as dimensões da imagem (e seu pai Frame), para que ela seja visualizada com mais facilidade:

Captura de tela de um CarouselView com dimensionamento dinâmico de itens, no iOS e Android

Layout da direita para a esquerda

CarouselView pode fazer o layout de seu conteúdo em uma direção de fluxo da direita para a esquerda, definindo sua propriedade FlowDirection como RightToLeft. Entretanto, o ideal é que a propriedade FlowDirection seja definida em uma página ou layout raiz, o que faz com que todos os elementos da página ou layout raiz respondam à direção do fluxo:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="CarouselViewDemos.Views.HorizontalTemplateLayoutRTLPage"
             Title="Horizontal layout (RTL FlowDirection)"
             FlowDirection="RightToLeft">    
    <CarouselView ItemsSource="{Binding Monkeys}">
        ...
    </CarouselView>
</ContentPage>

O padrão FlowDirection para um elemento com um pai é MatchParent. Portanto, o CarouselView herda o valor da propriedade FlowDirection do ContentPage.

Para obter mais informações sobre a direção do fluxo, consulte Localização da direita para a esquerda.