Podsumowanie rozdziału 10. Rozszerzenia struktury znaczników XAML
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.
Zwykle analizator XAML konwertuje dowolny ciąg ustawiony jako wartość atrybutu na typ właściwości na podstawie standardowych konwersji dla podstawowych typów danych platformy .NET lub TypeConverter
pochodnej dołączonej do właściwości lub jej typu za pomocą TypeConverterAttribute
.
Czasami jednak jest to wygodne, aby ustawić atrybut z innego źródła, na przykład element w słowniku, wartość właściwości statycznej lub pola albo na podstawie obliczeń pewnego rodzaju.
Jest to zadanie rozszerzenia znaczników XAML. Pomimo nazwy rozszerzenia znaczników XAML nie są rozszerzeniem xml. XAML jest zawsze legalny kod XML.
Infrastruktura kodu
Rozszerzenie znaczników XAML to klasa, która implementuje IMarkupExtension
interfejs. Taka klasa często zawiera słowo Extension
na końcu swojej nazwy, ale zwykle pojawia się w języku XAML bez tego sufiksu.
Następujące rozszerzenia znaczników XAML są obsługiwane przez wszystkie implementacje języka XAML:
x:Static
obsługiwane przezStaticExtension
x:Reference
obsługiwane przezReferenceExtension
x:Type
obsługiwane przezTypeExtension
x:Null
obsługiwane przezNullExtension
x:Array
obsługiwane przezArrayExtension
Te cztery rozszerzenia znaczników XAML są obsługiwane przez wiele implementacji XAML, w tym Xamarin.Forms:
StaticResource
obsługiwane przezStaticResourceExtension
DynamicResource
obsługiwane przezDynamicResourceExtension
Binding
obsługiwane przezBindingExtension
— omówione w rozdziale 16. Powiązanie danychTemplateBinding
obsługiwane przezTemplateBindingExtension
— nieuwzrożone w książce
Dodatkowe rozszerzenie znaczników XAML jest zawarte w Xamarin.Forms połączeniu z :RelativeLayout
ConstraintExpression
— nieuwzmieżone w książce
Uzyskiwanie dostępu do statycznych elementów członkowskich
x:Static
Użyj elementu , aby ustawić atrybut na wartość publicznej właściwości statycznej, pola lub elementu członkowskiego wyliczenia. Member
Ustaw właściwość na statyczny element członkowski. Zwykle łatwiej jest określić x:Static
nazwę elementu członkowskiego w nawiasach klamrowych. Nazwa Member
właściwości nie musi być dołączona, tylko sam element członkowski. Ta typowa składnia jest wyświetlana w przykładzie SharedStatics . Same pola statyczne są definiowane AppConstants
w klasie. Ta technika umożliwia ustanawianie stałych używanych za pomocą programu.
Dzięki dodatkowej deklaracji przestrzeni nazw XML można odwoływać się do publicznych właściwości statycznych, pól lub elementów członkowskich wyliczenia zdefiniowanych w programie .NET Framework, jak pokazano w przykładzie SystemStatics .
Słowniki zasobów
Klasa VisualElement
definiuje właściwość o nazwie Resources
, którą można ustawić na obiekt typu ResourceDictionary
. W języku XAML można przechowywać elementy w tym słowniku i identyfikować je za pomocą atrybutu x:Key
. Elementy przechowywane w słowniku zasobów są współużytkowane przez wszystkie odwołania do elementu.
StaticResource dla większości celów
W większości przypadków użyjesz StaticResource
rozszerzenia znaczników, aby odwołać się do elementu ze słownika zasobów, jak pokazano w przykładzie ResourceSharing . Można użyć StaticResourceExtension
elementu lub StaticResource
w nawiasach klamrowych:
Nie należy mylić x:Static
rozszerzenia znaczników i StaticResource
rozszerzenia znaczników.
Drzewo słowników
Gdy analizator XAML napotka element StaticResource
, rozpoczyna przeszukiwanie drzewa wizualnego pod kątem pasującego klucza, a następnie wyszukiwanie w ResourceDictionary
klasie aplikacji App
. Dzięki temu elementy w słowniku zasobów głębiej w drzewie wizualizacji zastępują słownik zasobów wyższe w drzewie wizualizacji. Jest to pokazane w przykładzie ResourceTrees .
DynamicResource do celów specjalnych
StaticResource
Rozszerzenie znaczników powoduje pobranie elementu ze słownika podczas tworzenia drzewa wizualnego podczas wywołaniaInitializeComponent
. Alternatywą jest to StaticResource
DynamicResource
, która utrzymuje link do klucza słownika i aktualizuje element docelowy, gdy element, do którego odwołuje się klucz, zmienia się.
Różnica między elementami StaticResource
i jest pokazana w przykładzie DynamicVsStatic.DynamicResource
Właściwość ustawiana DynamicResource
przez element musi być wspierana przez właściwość, którą można powiązać, zgodnie z opisem w rozdziale 11. Infrastruktura, którą można powiązać.
Rozszerzenia znaczników o mniejszym użyciu
x:Null
Użyj rozszerzenia znaczników, aby ustawić właściwość na null
.
x:Type
Użyj rozszerzenia znaczników, aby ustawić właściwość na obiekt .NETType
.
Użyj x:Array
polecenia , aby zdefiniować tablicę. Określ typ składowych tablicy, ustawiając właściwość [Type
] na x:Type
rozszerzenie znaczników.
Niestandardowe rozszerzenie znaczników
Możesz utworzyć własne rozszerzenia znaczników XAML, pisząc klasę, która implementuje IMarkupExtension
interfejs za pomocą ProvideValue
metody.
Klasa HslColorExtension
spełnia te wymagania. Tworzy wartość typu Color
na podstawie wartości właściwości o nazwie H
, S
, L
i A
. Ta klasa jest pierwszym elementem Xamarin.Forms w bibliotece o nazwie Xamarin.FormsBook.Toolkit, który jest zbudowany i używany w trakcie tej książki.
W przykładzie CustomExtensionDemo pokazano , jak odwoływać się do tej biblioteki i używać niestandardowego rozszerzenia znaczników.