Podsumowanie rozdziału 12. Style
Uwaga
Ta książka została opublikowana wiosną 2016 roku i od tego czasu nie została zaktualizowana. Jest wiele w książce, która pozostaje cenna, ale niektóre materiały są nieaktualne, a niektóre tematy nie są już całkowicie poprawne ani kompletne.
W Xamarin.Formssystemie style umożliwiają wielu widokom udostępnianie kolekcji ustawień właściwości. Zmniejsza to adiustację i umożliwia utrzymywanie spójnych motywów wizualnych.
Style są prawie zawsze definiowane i używane w adiustacji. Obiekt typu Style
jest tworzone w słowniku zasobów, a następnie ustawiany na Style
właściwość elementu wizualizacji przy użyciu StaticResource
rozszerzenia lub DynamicResource
znaczników.
Styl podstawowy
Obiekt Style
wymaga ustawienia TargetType
typu obiektu wizualizacji, do którego ma on zastosowanie. Gdy wystąpienie elementu Style
jest tworzone w słowniku zasobów (co jest wspólne), wymaga również atrybutu x:Key
.
Obiekt Style
ma właściwość zawartości typu Setters
, która jest kolekcją Setter
obiektów. Każdy Setter
element kojarzy element Property
z elementem Value
.
W języku XAML Property
ustawienie jest nazwą właściwości CLR (takiej jak Text
właściwość Button
klasy ), ale stylizowany właściwość musi być wspierana przez właściwość powiązaną. Ponadto właściwość musi być zdefiniowana w klasie wskazanej TargetType
przez ustawienie lub dziedziczona przez tą klasę.
Ustawienie można określić Value
przy użyciu elementu <Setter.Value>
właściwości . Dzięki temu można ustawić Value
obiekt, który nie może być wyrażony w ciągu tekstowym lub OnPlatform
do obiektu albo do obiektu utworzonego przy użyciu metody x:Arguments
lub x:FactoryMethod
. Właściwość Value
można również ustawić za pomocą StaticResource
wyrażenia na inny element w słowniku.
Program BasicStyle demonstruje podstawową składnię i pokazuje, jak odwoływać się Style
do elementu z StaticResource
rozszerzeniem znaczników:
Obiekt Style
i dowolny obiekt utworzony w Style
obiekcie jako Value
ustawienie są współużytkowane przez wszystkie widoki odwołujące się do tego Style
obiektu . Element Style
nie może zawierać żadnych elementów, których nie można udostępniać, takich jak pochodna View
.
Nie można ustawić programów obsługi zdarzeń w obiekcie Style
. Nie GestureRecognizers
można ustawić właściwości w obiekcie , Style
ponieważ nie jest ona wspierana przez właściwość, którą można powiązać.
Style w kodzie
Chociaż nie jest to powszechne, można utworzyć wystąpienie i zainicjować Style
obiekty w kodzie. Jest to pokazane przez przykład BasicStyleCode.
Dziedziczenie stylu
Style
BasedOn
ma właściwość, którą można ustawić na rozszerzenie znaczników odwołujące się do StaticResource
innego stylu. Dzięki temu style mogą dziedziczyć z poprzednich stylów i dodawać lub zastępować ustawienia właściwości. W przykładzie StyleInheritance pokazano to.
Jeśli Style2
element jest oparty na metodzie Style1
, element TargetType
Style2
musi być taki sam jak Style1
lub pochodzi z Style1
. Słownik zasobów, w którym Style1
jest przechowywany, musi być tym samym słownikiem zasobów co Style2
lub słownik zasobów wyższy w drzewie wizualizacji.
Style niejawne
Jeśli obiekt Style
w słowniku zasobów nie ma x:Key
ustawienia atrybutu, jest automatycznie przypisywany klucz słownika, a Style
obiekt staje się stylem niejawnym. Widok bez Style
ustawienia i którego typ pasuje TargetType
dokładnie do tego stylu, jak pokazano w przykładzie ImplicitStyle .
Niejawny styl może pochodzić z Style
elementu z ustawieniem x:Key
, ale nie z drugiej strony. Nie można jawnie odwołać się do niejawnego stylu.
Można zaimplementować trzy typy hierarchii za pomocą stylów i BasedOn
:
- Od stylów zdefiniowanych na
Application
iPage
w dół do stylów zdefiniowanych w układach niższych w drzewie wizualizacji. - Od stylów zdefiniowanych dla klas bazowych, takich jak
VisualElement
iView
, do stylów zdefiniowanych dla określonych klas. - Od stylów z jawnymi kluczami słownika do niejawnych stylów.
Te hierarchie przedstawiono w przykładzie StyleHierarchy .
Style dynamiczne
Styl w słowniku zasobów można odwoływać się DynamicResource
zamiast StaticResource
. To sprawia, że styl jest stylem dynamicznym. Jeśli ten styl zostanie zastąpiony w słowniku zasobów przez inny styl przy użyciu tego samego klucza, widoki odwołujące się do tego stylu zostaną DynamicResource
automatycznie zmienione. Ponadto brak wpisu słownika z określonym kluczem spowoduje StaticResource
wystąpienie wyjątku, ale nie DynamicResource
.
Ta technika umożliwia dynamiczne zmienianie stylu lub motywów, jak pokazano w przykładzie DynamicStyles .
Nie można jednak ustawić BasedOn
właściwości na DynamicResource
rozszerzenie makijażu, ponieważ BasedOn
nie jest wspierana przez właściwość, którą można powiązać. Aby dynamicznie utworzyć styl, nie należy ustawiać BasedOn
wartości . Zamiast tego ustaw BaseResourceKey
właściwość na klucz słownika stylu, z którego chcesz pochodzić. Przykład DynamicStylesInheritance pokazuje tę technikę.
Style urządzeń
Klasa Device.Styles
zagnieżdżona definiuje dwanaście statycznych pól tylko do odczytu dla sześciu stylów, TargetType
Label
których można użyć do typowych typów użycia tekstu.
Sześć z tych pól jest typu Style
, które można ustawić bezpośrednio na Style
właściwość w kodzie:
Pozostałe sześć pól jest typu string
i może służyć jako klucze słownika dla stylów dynamicznych:
BodyStyleKey
równe "BodyStyle"TitleStyleKey
równe "TitleStyle"SubtitleStyleKey
równe "Podtytuł"CaptionStyleKey
równe "CaptionStyle"ListItemTextStyleKey
równe "ListItemTextStyle"ListItemDetailTextStyleKey
równe "ListItemDetailTextStyle"
Te style są ilustrowane przez przykład DeviceStylesList.