Stili impliciti in Xamarin.Forms

Uno stile implicito è quello usato da tutti i controlli dello stesso TargetType, senza che ogni controllo faccia riferimento allo stile.

Creare uno stile implicito in XAML

Per dichiarare un oggetto Style a livello di pagina, è necessario aggiungere un oggetto ResourceDictionary alla pagina e quindi includere una o più Style dichiarazioni in ResourceDictionary. Un Style oggetto viene reso implicito non specificando un x:Key attributo. Lo stile verrà quindi applicato agli elementi visivi che corrispondono TargetType esattamente, ma non agli elementi derivati dal TargetType valore.

L'esempio di codice seguente mostra uno stile implicito dichiarato in XAML in una pagina ResourceDictionarye applicato alle istanze della Entry pagina:

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

ResourceDictionary Definisce un singolo stile implicito applicato alle istanze della Entry pagina. Viene Style utilizzato per visualizzare il testo blu su uno sfondo giallo, impostando anche altre opzioni di aspetto. L'oggetto StyleResourceDictionary viene aggiunto alla pagina senza specificare un x:Key attributo. Pertanto, l'oggetto Style viene applicato a tutte le Entry istanze in modo implicito in quanto corrispondono esattamente alla TargetType proprietà dell'oggetto Style . Tuttavia, l'oggetto Style non viene applicato all'istanza CustomEntry di , ovvero un sottoclassato Entry. Il risultato è l'aspetto illustrato negli screenshot seguenti:

Esempio di stili impliciti

Inoltre, il quarto Entry esegue l'override delle BackgroundColor proprietà e TextColor dello stile implicito a valori diversi Color .

Creare uno stile implicito a livello di controllo

Oltre a creare stili impliciti a livello di pagina, possono anche essere creati a livello di controllo, come illustrato nell'esempio di codice seguente:

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

In questo esempio, l'oggetto implicitoStyle viene assegnato alla Resources raccolta del StackLayout controllo . Lo stile implicito può quindi essere applicato al controllo e ai relativi elementi figlio.

Per informazioni sulla creazione di ResourceDictionarystili in un'applicazione, vedere Stili globali.

Creare uno stile implicito in C#

Style È possibile aggiungere istanze alla raccolta di Resources una pagina in C# creando un nuovo ResourceDictionaryoggetto e quindi aggiungendo le Style istanze a ResourceDictionary, come illustrato nell'esempio di codice seguente:

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

Il costruttore definisce un singolo stile implicito applicato alle istanze della Entry pagina. Viene Style utilizzato per visualizzare il testo blu su uno sfondo giallo, impostando anche altre opzioni di aspetto. L'oggetto StyleResourceDictionary viene aggiunto alla pagina senza specificare una key stringa. Pertanto, l'oggetto Style viene applicato a tutte le Entry istanze in modo implicito in quanto corrispondono esattamente alla TargetType proprietà dell'oggetto Style . Tuttavia, l'oggetto Style non viene applicato all'istanza CustomEntry di , ovvero un sottoclassato Entry.

Applicare uno stile ai tipi derivati

La Style.ApplyToDerivedTypes proprietà consente di applicare uno stile ai controlli derivati dal tipo di base a cui fa riferimento la TargetType proprietà . Pertanto, l'impostazione di questa proprietà su consente a true un singolo stile di specificare più tipi, purché i tipi derivino dal tipo di base specificato nella TargetType proprietà .

L'esempio seguente mostra uno stile implicito che imposta il colore di sfondo delle Button istanze su rosso:

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

L'inserimento di questo stile in un livello ResourceDictionary di pagina comporterà l'applicazione a tutte le Button istanze della pagina e anche a tutti i controlli che derivano da Button. Tuttavia, se la ApplyToDerivedTypes proprietà è rimasta non impostata, lo stile verrà applicato solo alle Button istanze.

Il codice C# equivalente è il seguente:

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

Resources = new ResourceDictionary { buttonStyle };