Niejawne style w Xamarin.Forms
Niejawny styl jest taki, który jest używany przez wszystkie kontrolki tego samego typu TargetType, bez konieczności odwołowania się do stylu przez każdą kontrolkę.
Tworzenie niejawnego stylu w języku XAML
Aby zadeklarować element Style
na poziomie strony, należy dodać element do strony, ResourceDictionary
a następnie w pliku można uwzględnić co najmniej jedną Style
deklarację ResourceDictionary
. Element a Style
jest niejawny, nie określając atrybutux:Key
. Styl zostanie następnie zastosowany do elementów wizualnych, które TargetType
pasują dokładnie, ale nie do elementów, które pochodzą z TargetType
wartości.
Poniższy przykład kodu przedstawia niejawny styl zadeklarowany w języku XAML w kodzie strony ResourceDictionary
i zastosowany do wystąpień strony Entry
:
<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>
Element ResourceDictionary
definiuje pojedynczy niejawny styl zastosowany do wystąpień strony Entry
. Element Style
służy do wyświetlania niebieskiego tekstu na żółtym tle, a jednocześnie ustawia inne opcje wyglądu. Element Style
jest dodawany do strony ResourceDictionary
bez określania atrybutu x:Key
. W związku z tym właściwość Style
jest stosowana do wszystkich Entry
wystąpień niejawnie zgodnie z właściwością TargetType
Style
dokładnie. Jednak parametr Style
nie jest stosowany do CustomEntry
wystąpienia, które jest podklasą Entry
. Spowoduje to wyświetlenie wyglądu pokazanego na poniższych zrzutach ekranu:
Ponadto czwarty Entry
zastępuje BackgroundColor
właściwości i TextColor
stylu niejawnego do różnych Color
wartości.
Tworzenie niejawnego stylu na poziomie kontrolki
Oprócz tworzenia niejawnych stylów na poziomie strony można je również utworzyć na poziomie kontroli, jak pokazano w poniższym przykładzie kodu:
<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>
W tym przykładzie niejawny Style
jest przypisywany do Resources
kolekcji kontrolkiStackLayout
. Następnie można zastosować niejawny styl do kontrolki i jej elementów podrzędnych.
Aby uzyskać informacje na temat tworzenia stylów w aplikacji ResourceDictionary
, zobacz Style globalne.
Tworzenie niejawnego stylu w języku C#
Style
wystąpienia można dodać do kolekcji strony Resources
w języku C#, tworząc nowy ResourceDictionary
element , a następnie dodając Style
wystąpienia do ResourceDictionary
obiektu , jak pokazano w poniższym przykładzie kodu:
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" }
}
};
}
}
Konstruktor definiuje pojedynczy niejawny styl zastosowany do wystąpień strony Entry
. Element Style
służy do wyświetlania niebieskiego tekstu na żółtym tle, a jednocześnie ustawia inne opcje wyglądu. Element Style
jest dodawany do strony ResourceDictionary
bez określania key
ciągu. W związku z tym właściwość Style
jest stosowana do wszystkich Entry
wystąpień niejawnie zgodnie z właściwością TargetType
Style
dokładnie. Jednak parametr Style
nie jest stosowany do CustomEntry
wystąpienia, które jest podklasą Entry
.
Stosowanie stylu do typów pochodnych
Właściwość Style.ApplyToDerivedTypes
umożliwia zastosowanie stylu do kontrolek, które pochodzą z typu podstawowego, do którego odwołuje TargetType
się właściwość . W związku z tym ustawienie tej właściwości w taki sposób, aby true
umożliwiało korzystanie z wielu typów w jednym stylu, pod warunkiem, że typy pochodzą z typu podstawowego określonego TargetType
we właściwości .
W poniższym przykładzie pokazano niejawny styl, który ustawia kolor Button
tła wystąpień na czerwony:
<Style TargetType="Button"
ApplyToDerivedTypes="True">
<Setter Property="BackgroundColor"
Value="Red" />
</Style>
Umieszczenie tego stylu na poziomie ResourceDictionary
strony spowoduje zastosowanie go do wszystkich Button
wystąpień na stronie, a także do wszystkich kontrolek, które pochodzą z elementu Button
. Jeśli ApplyToDerivedTypes
jednak właściwość nie została ustawiona, styl zostanie zastosowany tylko do Button
wystąpień.
Równoważny kod języka C# to:
var buttonStyle = new Style(typeof(Button))
{
ApplyToDerivedTypes = true,
Setters =
{
new Setter
{
Property = VisualElement.BackgroundColorProperty,
Value = Color.Red
}
}
};
Resources = new ResourceDictionary { buttonStyle };