Stili impliciti in Xamarin.Forms

Download Sample Scaricare l'esempio

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 Style oggetto a livello di pagina, è necessario aggiungere un ResourceDictionary oggetto 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>

Definisce ResourceDictionary 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 , che è una sottoclassata Entry. Il risultato è l'aspetto illustrato negli screenshot seguenti:

Implicit Styles Example

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 essere creati anche 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 Le istanze possono essere aggiunte 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 , che è una sottoclassata 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 true consente a un singolo stile di scegliere come destinazione 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 a 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 };