Estilos implícitos en Xamarin.Forms

Ejemplo de descarga Descarga del ejemplo

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

Creación de un estilo implícito en XAML

Para declarar un en el nivel de página, se debe agregar un a la página y, a continuación, se pueden incluir una o varias StyleResourceDictionaryStyle declaraciones en ResourceDictionary . Un Style se convierte en Style al no especificar un x:Key atributo. A continuación, el estilo se aplicará a los elementos visuales que coincidan exactamente, pero no a los elementos derivados TargetType del TargetType valor.

En el ejemplo de código siguiente se muestra un estilo implícito declarado en XAML en el de una página y aplicado a las instancias de la 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>

define ResourceDictionary un único estilo ResourceDictionary que se aplica a las instancias de Entry la página. se Style usa para mostrar texto azul en un fondo amarillo, al tiempo que se estableciendo otras opciones de apariencia. se Style agrega a la página sin especificar un atributo ResourceDictionaryx:Key . Por lo tanto, se aplica a todas las instancias implícitamente, ya que coinciden con la propiedad StyleEntryStyle data-linktype="absolute->path" de Xamarin_Forms _Style_TargetType" TargetTypeStyle exactamente. Sin embargo, Style no se aplica a la instancia de , que es una CustomEntry subclase Entry . El resultado es el aspecto que se muestra en las capturas de pantalla siguientes:

Ejemplo de estilos implícitos

Además Xamarin_Forms, la cuarta invalida las propiedades EntryEntry data-linktype="absolute-path">_VisualElement_BackgroundColor y BackgroundColor Xamarin_Forms _InputView_TextColor" data-linktype="absolute-path">TextColorColor del estilo implícito en valores diferentes.

Creación de 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 valor implícito se asigna a la colección Xamarin_Forms _VisualElement_Resources" data-linktype="absolute-path">Resources del StackLayout control. A continuación, el estilo implícito se puede aplicar al control y sus secundarios.

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

Creación de un estilo implícito en C #

StyleLas instancias se pueden agregar a la colección Xamarin_Forms Style _VisualElement_Resources" data-linktype="absolute-path">de una página en C# mediante la creación de una nueva colección y, a continuación, agregando las instancias a , como se muestra en el ejemplo de código ResourcesResourceDictionaryStyleResourceDictionary 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 único estilo implícito que se aplica a las instancias de la página. se Style usa para mostrar texto azul en un fondo amarillo, al tiempo que se estableciendo otras opciones de apariencia. se Style agrega a la página sin especificar una ResourceDictionarykey cadena. Por lo tanto, se aplica a todas las instancias implícitamente, ya que coinciden con la propiedad StyleEntryStyle data-linktype="absolute->path" de Xamarin_Forms _Style_TargetType" TargetTypeStyle exactamente. Sin embargo, Style no se aplica a la instancia de , que es una CustomEntry subclase Entry .

Aplicar un estilo a tipos derivados

La propiedad Xamarin_Forms _Style_ApplyToDerivedTypes" data-linktype="absolute-path">permite aplicar un estilo a los controles derivados del tipo base al que hace referencia la propiedad Style.ApplyToDerivedTypes Xamarin_Forms Style.ApplyToDerivedTypes _Style_TargetType" data-linktype="absolute-path">. TargetType Por lo tanto, al establecer esta propiedad en , se permite que un estilo único se ajuste a varios tipos, siempre que los tipos deriven del true tipo base especificado en la propiedad TargetType .

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 un nivel de página, se aplicará a todas las instancias de la página y también a cualquier control que ResourceDictionaryButton derive de Button . Sin embargo, si la propiedad Xamarin_Forms _Style_ApplyToDerivedTypes" data-linktype="absolute-path">permanece sin ApplyToDerivedTypes 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 };