Estilos implícitos enXamarin.Forms

Descargar ejemplo Descargar el ejemplo

Un estilo implícito es aquél que usan todos los controles del mismo TargetType, sin necesidad de que cada control haga referencia al estilo.

Crear un estilo implícito en XAML

Para declarar un Style en el nivel de página, ResourceDictionary se debe agregar a la página y, a continuación, Style se pueden incluir una o más declaraciones en ResourceDictionary . StyleSe hace implícito si no se especifica un x:Key atributo. A continuación, se aplicará el estilo a los elementos visuales que coinciden TargetType exactamente, pero no a los elementos que se derivan del TargetType valor.

En el ejemplo de código siguiente se muestra un estilo implícito declarado en XAML en una página ResourceDictionary y se aplica a las instancias de la página Entry :

<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>

ResourceDictionaryDefine un estilo implícito único que se aplica a las instancias de la página Entry . StyleSe usa para mostrar el texto azul sobre un fondo amarillo, mientras que también se establecen otras opciones de apariencia. StyleSe agrega al de la página ResourceDictionary sin especificar un x:Key atributo. Por lo tanto, Style se aplica a todas las Entry instancias de forma implícita, ya que coinciden exactamente con la TargetType propiedad de Style . Sin embargo, Style no se aplica a la CustomEntry instancia de, que es una subclase Entry . El resultado es el aspecto que se muestra en las capturas de pantalla siguientes:

Ejemplo de estilos implícitos

Además, el cuarto Entry invalida las BackgroundColor TextColor propiedades y del estilo implícito en Color valores diferentes.

Crear un estilo implícito en el nivel de control

Además de crear estilos implícitos en el nivel de página, también se pueden crear en el nivel de control, como se muestra en el ejemplo de código siguiente:

<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>

En este ejemplo, el implícito Style se asigna a la Resources colección del StackLayout control. A continuación, el estilo implícito se puede aplicar al control y a sus elementos secundarios.

Para obtener información sobre cómo crear estilos en la de una aplicación ResourceDictionary , vea estilos globales.

Crear un estilo implícito en C#

Stylelas instancias se pueden agregar a la colección de una página Resources en C# mediante la creación de una nueva ResourceDictionary y, a continuación, agregando las Style instancias a ResourceDictionary , tal y como se muestra en el ejemplo de código siguiente:

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" }
            }
        };
    }
}

El constructor define un estilo implícito único que se aplica a las instancias de la página Entry . StyleSe usa para mostrar el texto azul sobre un fondo amarillo, mientras que también se establecen otras opciones de apariencia. StyleSe agrega al de la página ResourceDictionary sin especificar una key cadena. Por lo tanto, Style se aplica a todas las Entry instancias de forma implícita, ya que coinciden exactamente con la TargetType propiedad de Style . Sin embargo, Style no se aplica a la CustomEntry instancia de, que es una subclase Entry .

Aplicar un estilo a los tipos derivados

La Style.ApplyToDerivedTypes propiedad permite aplicar un estilo a los controles que se derivan del tipo base al que hace referencia la TargetType propiedad. Por lo tanto, establecer esta propiedad en true permite que un único estilo tenga como destino varios tipos, siempre que los tipos deriven del tipo base especificado en la TargetType propiedad.

En el ejemplo siguiente se muestra un estilo implícito que establece el color de fondo de Button las instancias en rojo:

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

Al colocar este estilo en el nivel de página ResourceDictionary , se aplicará a todas Button las instancias de la página y también a los controles que deriven de Button . Sin embargo, si la ApplyToDerivedTypes propiedad permanece sin establecer, el estilo solo se aplicaría a Button las instancias de.

El código de C# equivalente es el siguiente:

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

Resources = new ResourceDictionary { buttonStyle };