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 ResourceDictionary
e 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 Style
ResourceDictionary
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:
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 implicito Style
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 ResourceDictionary
stili 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 ResourceDictionary
oggetto 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 Style
ResourceDictionary
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 };