Compartilhar via


Estilos implícitos em Xamarin.Forms

Um estilo implícito é aquele usado por todos os controles do mesmo TargetType, sem exigir que cada controle faça referência ao estilo.

Criar um estilo implícito em XAML

Para declarar a Style no nível da página, a ResourceDictionary deve ser adicionado à página e, em seguida, uma ou mais Style declarações podem ser incluídas no ResourceDictionary. Um Style é feito implícito não especificando um atributo x:Key. O estilo será aplicado a elementos visuais que correspondam TargetType exatamente, mas não a elementos derivados do TargetType valor.

O exemplo de Entry código a seguir mostra um estilo implícito declarado em XAML no , de ResourceDictionaryuma página e aplicado às instâncias da página:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:local="clr-namespace:Styles;assembly=Styles" x:Class="Styles.ImplicitStylesPage" Title="Implicit" IconImageSource="xaml.png">
    <ContentPage.Resources>
        <ResourceDictionary>
            <Style TargetType="Entry">
                <Setter Property="HorizontalOptions" Value="Fill" />
                <Setter Property="VerticalOptions" Value="CenterAndExpand" />
                <Setter Property="BackgroundColor" Value="Yellow" />
                <Setter Property="FontAttributes" Value="Italic" />
                <Setter Property="TextColor" Value="Blue" />
            </Style>
        </ResourceDictionary>
    </ContentPage.Resources>
    <ContentPage.Content>
        <StackLayout Padding="0,20,0,0">
            <Entry Text="These entries" />
            <Entry Text="are demonstrating" />
            <Entry Text="implicit styles," />
            <Entry Text="and an implicit style override" BackgroundColor="Lime" TextColor="Red" />
            <local:CustomEntry Text="Subclassed Entry is not receiving the style" />
        </StackLayout>
    </ContentPage.Content>
</ContentPage>

O ResourceDictionary define um único estilo implícito que é aplicado às instâncias da Entry página. O Style é usado para exibir texto azul em um fundo amarelo, ao mesmo tempo em que define outras opções de aparência. O Style é adicionado ao ResourceDictionary da página sem especificar um atributo x:Key. Portanto, o Style é aplicado a todas as Entry instâncias implicitamente, pois elas correspondem à TargetType propriedade de exatamente Style . No entanto, o Style não é aplicado à CustomEntry instância, que é uma subclasse Entry. Isso resulta na aparência mostrada nas capturas de tela seguir:

Exemplo de estilos implícitos

Além disso, a quarta Entry substitui as BackgroundColor propriedades e TextColor do estilo implícito para valores diferentes Color .

Criar um estilo implícito no nível do controle

Além de criar estilos implícitos no nível da página, eles também podem ser criados no nível do controle, conforme mostrado no exemplo de código a seguir:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:local="clr-namespace:Styles;assembly=Styles" x:Class="Styles.ImplicitStylesPage" Title="Implicit" IconImageSource="xaml.png">
    <ContentPage.Content>
        <StackLayout Padding="0,20,0,0">
            <StackLayout.Resources>
                <ResourceDictionary>
                    <Style TargetType="Entry">
                        <Setter Property="HorizontalOptions" Value="Fill" />
                        ...
                    </Style>
                </ResourceDictionary>
            </StackLayout.Resources>
            <Entry Text="These entries" />
            ...
        </StackLayout>
    </ContentPage.Content>
</ContentPage>

Neste exemplo, o implícito Style é atribuído à Resources coleção do StackLayout controle. O estilo implícito pode ser aplicado ao controle e seus filhos.

Para obter informações sobre como criar estilos no ResourceDictionary, consulte Estilos globais.

Criar um estilo implícito em C#

Style instâncias podem ser adicionadas à coleção de Resources uma página em C# criando um novo ResourceDictionarye, em seguida, adicionando as Style instâncias ao ResourceDictionary, conforme mostrado no exemplo de código a seguir:

public class ImplicitStylesPageCS : ContentPage
{
    public ImplicitStylesPageCS ()
    {
        var entryStyle = new Style (typeof(Entry)) {
            Setters = {
                ...
                new Setter { Property = Entry.TextColorProperty, Value = Color.Blue }
            }
        };

        ...
        Resources = new ResourceDictionary ();
        Resources.Add (entryStyle);

        Content = new StackLayout {
            Children = {
                new Entry { Text = "These entries" },
                new Entry { Text = "are demonstrating" },
                new Entry { Text = "implicit styles," },
                new Entry { Text = "and an implicit style override", BackgroundColor = Color.Lime, TextColor = Color.Red },
                new CustomEntry  { Text = "Subclassed Entry is not receiving the style" }
            }
        };
    }
}

O construtor define um único estilo implícito que é aplicado às instâncias da Entry página. O Style é usado para exibir texto azul em um fundo amarelo, ao mesmo tempo em que define outras opções de aparência. O Style é adicionado à página ResourceDictionary sem especificar uma key string. Portanto, o Style é aplicado a todas as Entry instâncias implicitamente, pois elas correspondem à TargetType propriedade de exatamente Style . No entanto, o Style não é aplicado à CustomEntry instância, que é uma subclasse Entry.

Aplicar um estilo a tipos derivados

A propriedade Style.ApplyToDerivedTypes permite que um estilo seja aplicado a controles derivados do tipo base referenciado pela propriedade TargetType. Portanto, definir essa propriedade como true permite que um único estilo tenha como destino vários tipos, desde que os tipos derivem do tipo base especificado na propriedade TargetType.

O exemplo a seguir mostra um estilo implícito que define a cor de fundo de Button instâncias como vermelho:

<Style TargetType="Button"
       ApplyToDerivedTypes="True">
    <Setter Property="BackgroundColor"
            Value="Red" />
</Style>

Colocar esse estilo em um nível ResourceDictionary de página resultará na aplicação dele a todas as Button instâncias da página e também a todos os controles derivados de Button. No entanto, se a ApplyToDerivedTypes propriedade permanecesse não definida, o estilo só seria aplicado a Button instâncias.

Este é o código C# equivalente:

var buttonStyle = new Style(typeof(Button))
{
    ApplyToDerivedTypes = true,
    Setters =
    {
        new Setter
        {
            Property = VisualElement.BackgroundColorProperty,
            Value = Color.Red
        }
    }
};

Resources = new ResourceDictionary { buttonStyle };