Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Os estilos podem herdar de outros estilos para reduzir a duplicação e permitir a reutilização.
Herança de estilo em XAML
A herança de estilo é executada definindo a Style.BasedOn propriedade como um Style. Em XAML, isso é feito definindo a BasedOn propriedade como uma StaticResource extensão de marcação que faz referência a um Stylearquivo . Em C#, isso é obtido definindo a BasedOn propriedade como uma Style instância.
Os estilos que herdam de um estilo base podem incluir Setter instâncias para novas propriedades ou usá-las para substituir estilos do estilo base. Além disso, os estilos que herdam de um estilo base devem ter como destino o mesmo tipo ou um tipo que deriva do tipo direcionado pelo estilo base. Por exemplo, se um estilo base for direcionado a View instâncias, os estilos baseados no estilo base poderão ser direcionados View a instâncias ou tipos derivados da View classe, como Label instâncias e Button .
O código a seguir demonstra a herança de estilo explícito em uma página XAML:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="Styles.StyleInheritancePage" Title="Inheritance" IconImageSource="xaml.png">
<ContentPage.Resources>
<ResourceDictionary>
<Style x:Key="baseStyle" TargetType="View">
<Setter Property="HorizontalOptions"
Value="Center" />
<Setter Property="VerticalOptions"
Value="CenterAndExpand" />
</Style>
<Style x:Key="labelStyle" TargetType="Label"
BasedOn="{StaticResource baseStyle}">
...
<Setter Property="TextColor" Value="Teal" />
</Style>
<Style x:Key="buttonStyle" TargetType="Button"
BasedOn="{StaticResource baseStyle}">
<Setter Property="BorderColor" Value="Lime" />
...
</Style>
</ResourceDictionary>
</ContentPage.Resources>
<ContentPage.Content>
<StackLayout Padding="0,20,0,0">
<Label Text="These labels"
Style="{StaticResource labelStyle}" />
...
<Button Text="So is the button"
Style="{StaticResource buttonStyle}" />
</StackLayout>
</ContentPage.Content>
</ContentPage>
As baseStyle instâncias de destino View e define as HorizontalOptions propriedades and VerticalOptions . O baseStyle não é definido diretamente em nenhum controle. Em vez disso, labelStyle e buttonStyle herdam dele, definindo valores de propriedade associáveis adicionais. Os labelStyle e buttonStyle são então aplicados às instâncias e Button instânciasLabel, definindo suas Style propriedades. Isso resulta na aparência mostrada nas capturas de tela seguir:
Observação
Um estilo implícito pode ser derivado de um estilo explícito, mas um estilo explícito não pode ser derivado de um estilo implícito.
Respeitando a cadeia de herança
Um estilo só pode herdar de estilos no mesmo nível ou acima na hierarquia de exibição. Isso significa que:
- Um recurso de nível de aplicativo só pode herdar de outros recursos de nível de aplicativo.
- Um recurso de nível de página pode herdar de recursos de nível de aplicativo e outros recursos de nível de página.
- Um recurso de nível de controle pode herdar de recursos de nível de aplicativo, recursos de nível de página e outros recursos de nível de controle.
Essa cadeia de herança é demonstrada no exemplo de código a seguir:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="Styles.StyleInheritancePage" Title="Inheritance" IconImageSource="xaml.png">
<ContentPage.Resources>
<ResourceDictionary>
<Style x:Key="baseStyle" TargetType="View">
...
</Style>
</ResourceDictionary>
</ContentPage.Resources>
<ContentPage.Content>
<StackLayout Padding="0,20,0,0">
<StackLayout.Resources>
<ResourceDictionary>
<Style x:Key="labelStyle" TargetType="Label" BasedOn="{StaticResource baseStyle}">
...
</Style>
<Style x:Key="buttonStyle" TargetType="Button" BasedOn="{StaticResource baseStyle}">
...
</Style>
</ResourceDictionary>
</StackLayout.Resources>
...
</StackLayout>
</ContentPage.Content>
</ContentPage>
Neste exemplo, labelStyle and buttonStyle são recursos de nível de controle, while baseStyle é um recurso de nível de página. No entanto, while labelStyle e buttonStyle inherit from , não é possível baseStyle herdar de labelStyle ou buttonStyle, devido às suas respectivas localizações na hierarquia de baseStyleexibição.
Herança de estilo em C#
A página C# equivalente, em que Style as Style instâncias são atribuídas diretamente às propriedades dos controles necessários, é mostrada no seguinte exemplo de código:
public class StyleInheritancePageCS : ContentPage
{
public StyleInheritancePageCS ()
{
var baseStyle = new Style (typeof(View)) {
Setters = {
new Setter {
Property = View.HorizontalOptionsProperty, Value = LayoutOptions.Center },
...
}
};
var labelStyle = new Style (typeof(Label)) {
BasedOn = baseStyle,
Setters = {
...
new Setter { Property = Label.TextColorProperty, Value = Color.Teal }
}
};
var buttonStyle = new Style (typeof(Button)) {
BasedOn = baseStyle,
Setters = {
new Setter { Property = Button.BorderColorProperty, Value = Color.Lime },
...
}
};
...
Content = new StackLayout {
Children = {
new Label { Text = "These labels", Style = labelStyle },
...
new Button { Text = "So is the button", Style = buttonStyle }
}
};
}
}
As baseStyle instâncias de destino View e define as HorizontalOptions propriedades and VerticalOptions . O baseStyle não é definido diretamente em nenhum controle. Em vez disso, labelStyle e buttonStyle herdam dele, definindo valores de propriedade associáveis adicionais. Os labelStyle e buttonStyle são então aplicados às instâncias e Button instânciasLabel, definindo suas Style propriedades.
