Estilos implícitos em Xamarin.Forms
Um estilo implícito é aquele usado por todos os controles do mesmo TargetType, sem exigir que cada controle faça referência ao estilo.
Criar um estilo implícito em XAML
Para declarar a Style
no nível da página, a ResourceDictionary
deve ser adicionado à página e, em seguida, uma ou mais Style
declarações podem ser incluídas no ResourceDictionary
. Um Style
é feito implícito não especificando um atributo x:Key
. O estilo será aplicado a elementos visuais que correspondam TargetType
exatamente, mas não a elementos derivados do TargetType
valor.
O exemplo de Entry
código a seguir mostra um estilo implícito declarado em XAML no , de ResourceDictionary
uma página e aplicado às instâncias da 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>
O ResourceDictionary
define um único estilo implícito que é aplicado às instâncias da Entry
página. O Style
é usado para exibir texto azul em um fundo amarelo, ao mesmo tempo em que define outras opções de aparência. O Style
é adicionado ao ResourceDictionary
da página sem especificar um atributo x:Key
. Portanto, o Style
é aplicado a todas as Entry
instâncias implicitamente, pois elas correspondem à TargetType
propriedade de exatamente Style
. No entanto, o Style
não é aplicado à CustomEntry
instância, que é uma subclasse Entry
. Isso resulta na aparência mostrada nas capturas de tela seguir:
Além disso, a quarta Entry
substitui as BackgroundColor
propriedades e TextColor
do estilo implícito para valores diferentes Color
.
Criar um estilo implícito no nível do controle
Além de criar estilos implícitos no nível da página, eles também podem ser criados no nível do controle, conforme mostrado no exemplo de código a seguir:
<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>
Neste exemplo, o implícito Style
é atribuído à Resources
coleção do StackLayout
controle. O estilo implícito pode ser aplicado ao controle e seus filhos.
Para obter informações sobre como criar estilos no ResourceDictionary
, consulte Estilos globais.
Criar um estilo implícito em C#
Style
instâncias podem ser adicionadas à coleção de Resources
uma página em C# criando um novo ResourceDictionary
e, em seguida, adicionando as Style
instâncias ao ResourceDictionary
, conforme mostrado no exemplo de código a seguir:
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" }
}
};
}
}
O construtor define um único estilo implícito que é aplicado às instâncias da Entry
página. O Style
é usado para exibir texto azul em um fundo amarelo, ao mesmo tempo em que define outras opções de aparência. O Style
é adicionado à página ResourceDictionary
sem especificar uma key
string. Portanto, o Style
é aplicado a todas as Entry
instâncias implicitamente, pois elas correspondem à TargetType
propriedade de exatamente Style
. No entanto, o Style
não é aplicado à CustomEntry
instância, que é uma subclasse Entry
.
Aplicar um estilo a tipos derivados
A propriedade Style.ApplyToDerivedTypes
permite que um estilo seja aplicado a controles derivados do tipo base referenciado pela propriedade TargetType
. Portanto, definir essa propriedade como true
permite que um único estilo tenha como destino vários tipos, desde que os tipos derivem do tipo base especificado na propriedade TargetType
.
O exemplo a seguir mostra um estilo implícito que define a cor de fundo de Button
instâncias como vermelho:
<Style TargetType="Button"
ApplyToDerivedTypes="True">
<Setter Property="BackgroundColor"
Value="Red" />
</Style>
Colocar esse estilo em um nível ResourceDictionary
de página resultará na aplicação dele a todas as Button
instâncias da página e também a todos os controles derivados de Button
. No entanto, se a ApplyToDerivedTypes
propriedade permanecesse não definida, o estilo só seria aplicado a Button
instâncias.
Este é o código C# equivalente:
var buttonStyle = new Style(typeof(Button))
{
ApplyToDerivedTypes = true,
Setters =
{
new Setter
{
Property = VisualElement.BackgroundColorProperty,
Value = Color.Red
}
}
};
Resources = new ResourceDictionary { buttonStyle };