Udostępnij za pośrednictwem


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 nierozszerzeniem 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:

Te cztery rozszerzenia znaczników XAML są obsługiwane przez wiele implementacji XAML, w tym Xamarin.Forms:

Dodatkowe rozszerzenie znaczników XAML jest zawarte w Xamarin.Forms połączeniu z :RelativeLayout

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:

Potrójny zrzut ekranu przedstawiający udostępnianie zasobów

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, Li 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.