Share via


Estilos implícitos em Xamarin.Forms

Um estilo implícito é aquele que é 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 um no nível da Style página, um ResourceDictionary deve ser adicionado à página e, em seguida, uma ou mais Style declarações podem ser incluídas no ResourceDictionary. A Style torna-se implícito por não especificar um x:Key atributo. O estilo será então aplicado a elementos visuais que correspondem exatamente TargetType , mas não a elementos derivados do TargetType valor.

O exemplo de ResourceDictionarycódigo a seguir mostra um estilo implícito declarado em XAML no , de uma página e aplicado às instâncias da Entry 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 plano de fundo amarelo, enquanto também define outras opções de aparência. O Style é adicionado à página sem ResourceDictionary especificar um x:Key atributo. Portanto, o Style é aplicado a todas as Entry instâncias implicitamente, pois elas correspondem à TargetType propriedade do Style exatamente. 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, o quarto Entry substitui as BackgroundColor propriedades e TextColor do estilo implícito para valores diferentes Color .

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

Além de criar estilos implícitos no nível da página, eles também podem ser criados no nível de 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ícitoStyle é atribuído à Resources coleção do StackLayout controle. O estilo implícito pode então ser aplicado ao controle e seus filhos.

Para obter informações sobre como criar estilos em um aplicativo 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 plano de fundo amarelo, enquanto também define outras opções de aparência. O Style é adicionado à página sem especificar uma key cadeia de ResourceDictionary caracteres. Portanto, o Style é aplicado a todas as Entry instâncias implicitamente, pois elas correspondem à TargetType propriedade do Style exatamente. No entanto, o Style não é aplicado à CustomEntry instância, que é uma subclasse Entry.

Aplicar um estilo a tipos derivados

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

O exemplo a seguir mostra um estilo implícito que define a cor do plano de fundo das Button ocorrê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 quaisquer controles derivados do 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 };