Udostępnij przez


Przewodnik po składni języka XAML

Objaśniamy reguły składni XAML i terminologię opisujące ograniczenia lub opcje dostępne dla składni XAML. Ten temat jest przydatny, jeśli dopiero zaczynasz korzystać z języka XAML, chcesz odświeżyć terminologię lub części składni albo chcesz poznać sposób działania języka XAML i chcesz uzyskać więcej tła i kontekstu.

XAML jest XML

Język XAML (Extensible Application Markup Language) ma podstawową składnię, która opiera się na kodzie XML, a z definicji prawidłowy kod XAML musi być prawidłowym kodem XML. Jednak język XAML ma również własne pojęcia składni, które rozszerzają kod XML. Dana jednostka XML może być prawidłowa w postaci zwykłego kodu XML, ale ta składnia może mieć inne i bardziej kompletne znaczenie jako XAML. W tym temacie opisano te pojęcia dotyczące składni języka XAML.

Słownictwo XAML

Jednym z obszarów, w których język XAML różni się od większości użycia XML, jest to, że język XAML nie jest zwykle wymuszany przy użyciu schematu, takiego jak plik XSD. Dzieje się tak, ponieważ XAML ma być rozszerzalny, oznacza to "X" w akronimie XAML. Po przeanalizowaniu kodu XAML elementy i atrybuty, do których odwołujesz się w języku XAML, powinny istnieć w niektórych reprezentacjach kodu zapasowego w podstawowych typach zdefiniowanych przez środowisko uruchomieniowe systemu Windows lub w typach, które rozszerzają środowisko uruchomieniowe systemu Windows lub są oparte na środowisku uruchomieniowym systemu Windows. Dokumentacja zestawu SDK czasami odnosi się do typów, które są już wbudowane w środowisko uruchomieniowe systemu Windows i mogą być używane w języku XAML jako słownictwo XAML dla środowiska uruchomieniowego systemu Windows. Program Microsoft Visual Studio ułatwia tworzenie znaczników prawidłowych w ramach tego słownictwa XAML. Program Visual Studio może również uwzględniać niestandardowe typy użycia XAML, o ile źródło tych typów jest poprawnie przywoływane w projekcie. Aby uzyskać więcej informacji na temat języka XAML i typów niestandardowych, zobacz Przestrzenie nazw XAML i mapowanie przestrzeni nazw.

Deklarowanie obiektów

Programiści często myślą pod względem obiektów i elementów członkowskich, podczas gdy język znaczników jest koncepcyjnie określany jako elementy i atrybuty. W najprostszym ujęciu, element zadeklarowany w markupu XAML staje się obiektem w środowisku uruchomieniowym. Aby utworzyć obiekt czasu wykonywania dla aplikacji, należy zadeklarować element XAML w znaczniku XAML. Obiekt jest tworzony, gdy środowisko uruchomieniowe systemu Windows ładuje kod XAML.

Plik XAML zawsze zawiera dokładnie jeden element służący jako element główny, który deklaruje obiekt, który będzie głównym elementem koncepcyjnym niektórych struktur programistycznych, takich jak strona, lub grafem obiektu całej definicji czasu wykonywania aplikacji.

Jeśli chodzi o składnię XAML, istnieją trzy sposoby deklarowania obiektów w języku XAML:

  • Bezpośrednio przy użyciu składni elementu object: Używa to tagów otwierania i zamykania w celu inicjalizacji obiektu w formie elementu XML. Ta składnia służy do deklarowania obiektów głównych lub tworzenia zagnieżdżonych obiektów, które ustawiają wartości właściwości.
  • Pośrednio przy użyciu składni atrybutu: Używa to wbudowanej wartości ciągu zawierającej instrukcje dotyczące tworzenia obiektu. Parser XAML używa tego łańcucha, aby ustawić wartość właściwości na nowo utworzoną wartość referencyjną. Obsługa tej funkcji jest ograniczona do niektórych typowych obiektów i właściwości.
  • Korzystanie z rozszerzenia znacznikowego.

Nie oznacza to, że zawsze masz do wyboru dowolną składnię tworzenia obiektów w słownictwie XAML. Niektóre obiekty można tworzyć tylko przy użyciu składni elementu obiektu. Niektóre obiekty można tworzyć tylko poprzez początkowe ustawienie w atrybucie. W rzeczywistości obiekty, które można utworzyć za pomocą składni elementu obiektu lub atrybutu, są stosunkowo rzadkie w słownictwie XAML. Nawet jeśli oba formularze składni są możliwe, jedna ze składni będzie bardziej powszechna jako kwestia stylu. Istnieją również techniki, których można użyć w języku XAML, aby odwoływać się do istniejących obiektów, a nie tworzyć nowych wartości. Istniejące obiekty mogą być zdefiniowane w innych obszarach XAML lub mogą istnieć niejawnie za pośrednictwem niektórych zachowań platformy i jej aplikacji lub modeli programowania.

Deklarowanie obiektu przy użyciu składni elementu object

Aby zadeklarować obiekt ze składnią elementu obiektu, należy napisać tagi w następujący sposób: <objectName> </objectName>, gdzie objectName jest nazwą typu dla obiektu, który chcesz utworzyć. Oto użycie elementu w celu zadeklarowania obiektu Canvas:

<Canvas>
</Canvas>

Jeśli obiekt nie zawiera innych obiektów, można zadeklarować element obiektu za pomocą jednego tagu zamykającego zamiast pary otwierającej/zamykającej: <Canvas />

Containers

Wiele obiektów używanych jako elementy interfejsu użytkownika, takich jak Canvas, może zawierać inne obiekty. Są one czasami określane jako kontenery. W poniższym przykładzie pokazano kontener kanwy , który zawiera jeden element— prostokąt.

<Canvas>
  <Rectangle />
</Canvas>

Deklarowanie obiektu przy użyciu składni atrybutu

Ponieważ to zachowanie jest powiązane z ustawieniem właściwości, omówimy to bardziej w kolejnych sekcjach.

Tekst inicjowania

W przypadku niektórych obiektów można zadeklarować nowe wartości przy użyciu tekstu wewnętrznego, który jest używany jako wartości inicjowania do budowy. W języku XAML ta technika i składnia jest nazywana tekstem inicjowania. Koncepcyjnie tekst inicjowania jest podobny do wywoływania konstruktora, który ma parametry. Tekst inicjowania jest przydatny do ustawiania początkowych wartości niektórych struktur.

Często używasz składni elementu obiektu z tekstem inicjowania, jeśli chcesz, aby wartość struktury z wartością x:Key mogła istnieć w elemecie ResourceDictionary. Możesz to zrobić, jeśli udostępniasz tę wartość struktury wielu właściwościom docelowym. W przypadku niektórych struktur nie można użyć składni atrybutów, aby ustawić wartości struktury: tekst inicjowania jest jedynym sposobem tworzenia przydatnego i współużytkowalnego zasobu CornerRadius, Grubość, GridLength lub Kolor .

W tym skróconym przykładzie użyto tekstu inicjalizacji do określenia wartości dla parametru grubości, w tym przypadku ustawiając zarówno lewe jak i prawe na 20 oraz zarówno górne jak i dolne na 10. W tym przykładzie pokazano grubość utworzoną jako zasób kluczowy, a następnie odwołanie do tego zasobu. Aby uzyskać więcej informacji na temat tekstu inicjalizacji grubości, zobacz Grubość.

<UserControl ...>
  <UserControl.Resources>
    <Thickness x:Key="TwentyTenThickness">20,10</Thickness>
    ....
  </UserControl.Resources>
  ...
  <Grid Margin="{StaticResource TwentyTenThickness}">
  ...
  </Grid>
</UserControl ...>

Uwaga / Notatka

Niektórych struktur nie można zadeklarować jako elementów obiektów. Tekst inicjalizacyjny nie jest obsługiwany i nie można go używać jako zasobu. Aby ustawić właściwości na te wartości w języku XAML, należy użyć składni atrybutu. Są to: Duration, RepeatBehavior, Point, Rect i Size.

Ustawianie właściwości

Właściwości obiektów zadeklarowanych za pomocą składni elementu obiektu można ustawić. Istnieje wiele sposobów ustawiania właściwości w języku XAML:

  • Stosując składnię atrybutu.
  • Przy użyciu składni elementu właściwości.
  • Kiedy używasz składni elementów, w której zawartość (tekst wewnętrzny lub elementy podrzędne) służy do ustawiania właściwości zawartości XAML obiektu.
  • Przy użyciu składni kolekcji (która zwykle jest domyślną składnią kolekcji).

Podobnie jak w przypadku deklaracji obiektu ta lista nie oznacza, że każda właściwość może zostać ustawiona przy użyciu każdej z technik. Niektóre właściwości obsługują tylko jedną z technik. Niektóre właściwości obsługują więcej niż jeden formularz; Istnieją na przykład właściwości, które mogą używać składni elementu właściwości lub składni atrybutu. To, co jest możliwe, zależy zarówno od właściwości, jak i od typu obiektu używanego przez właściwość. W dokumentacji interfejsu API środowiska uruchomieniowego systemu Windows zobaczysz przypadki użycia języka XAML, które można wykorzystać w sekcji Składnia. Czasami istnieje alternatywne zastosowanie, które działałoby, ale byłoby bardziej rozwlekłe. Te rozbudowane użycia nie zawsze są wyświetlane, ponieważ staramy się przedstawić najlepsze praktyki lub rzeczywiste scenariusze użycia tej właściwości w XAML. Wskazówki dotyczące składni XAML są dostępne w sekcjach Użycie XAML stron referencyjnych dotyczących właściwości, które można ustawić w języku XAML.

Niektórych właściwości obiektów nie można ustawić w języku XAML w żaden sposób i można ustawić tylko przy użyciu kodu. Zazwyczaj są to właściwości, które są bardziej odpowiednie do pracy w kodzie, a nie w języku XAML.

Nie można ustawić właściwości tylko do odczytu w języku XAML. Nawet w kodzie typ właścicielski musiałby obsługiwać inny sposób jego ustawienia, jak przeciążenie konstruktora, metoda pomocnicza lub obsługa właściwości obliczanej. Właściwość obliczeniowa opiera się na wartościach innych ustawialnych właściwości oraz czasami zdarzenia, które mają wbudowaną obsługę; te funkcje są dostępne w systemie właściwości zależności. Aby uzyskać więcej informacji na temat sposobu, w jaki właściwości zależności są przydatne do obsługi właściwości obliczeniowych, zobacz Omówienie właściwości zależności.

Składnia kolekcji w języku XAML sprawia wrażenie, że ustawiasz właściwość, która wydaje się być tylko do odczytu, ale w rzeczywistości tego nie robisz. Zobacz "Składnia kolekcji" w dalszej części tego tematu.

Ustawianie właściwości przy użyciu składni atrybutów

Ustawienie wartości atrybutu to typowy sposób ustawiania wartości właściwości w języku znaczników, na przykład w języku XML lub HTML. Ustawienie atrybutów XAML jest podobne do sposobu ustawiania wartości atrybutów w formacie XML. Nazwa atrybutu jest określana w dowolnym momencie w tagach po nazwie elementu, oddzielona od nazwy elementu co najmniej jednym białym znakiem. Po nazwie atrybutu następuje znak równości. Wartość atrybutu jest zawarta w parze cudzysłowów. Cudzysłowy mogą być podwójnymi lub pojedynczymi, pod warunkiem, że pasują i otaczają wartość. Sama wartość atrybutu musi być wyrażalna jako ciąg. Ciąg często zawiera cyfry, ale w języku XAML wszystkie wartości atrybutów są wartościami ciągów, dopóki analizator XAML nie zostanie zaangażowany i wykona pewną podstawową konwersję wartości.

W tym przykładzie użyto składni atrybutów dla czterech atrybutów, aby ustawić właściwości Name, Width, Height i Fill obiektu Prostokąt .

<Rectangle Name="rectangle1" Width="100" Height="100" Fill="Blue" />

Ustawianie właściwości przy użyciu składni elementu właściwości

Wiele właściwości obiektu można ustawić przy użyciu składni elementu właściwości. Element właściwości wygląda następująco: <obiekt.właściwość>.

Aby użyć składni elementu właściwości, należy utworzyć elementy właściwości XAML dla właściwości, którą chcesz ustawić. W standardowym kodzie XML ten element będzie po prostu traktowany jako element, który ma kropkę w nazwie. Jednak w języku XAML kropka w nazwie elementu identyfikuje element jako element właściwości, a właściwość powinna być elementem członkowskim obiektu w implementacji modelu obiektów zapasowych. Aby użyć składni elementu właściwości, należy określić element obiektu w celu "wypełnienia" tagów elementu właściwości. Element właściwości zawsze będzie miał pewną zawartość (pojedynczy element, wiele elementów lub tekst wewnętrzny); nie ma sensu mieć elementu właściwości samo zamykającej.

W poniższej gramatyki właściwość jest nazwą właściwości, którą chcesz ustawić, a propertyValueAsObjectElement jest pojedynczym elementem obiektu, który powinien spełniać wymagania dotyczące typu wartości właściwości.

< sprzeciwiać się>

< obiekt.własność>

propertyValueAsObjectElement

</ obiekt.właściwość>

</ sprzeciwiać się>

W poniższym przykładzie użyto składni elementu właściwości, aby ustawić wypełnienie prostokąta elementem obiektu SolidColorBrush. (W elemencie SolidColorBrush, Color został ustawiony jako atrybut). Przeanalizowany wynik tego kodu XAML jest identyczny z poprzednim przykładem XAML, który ustawił atrybut Fill przy użyciu składni atrybutu.

<Rectangle
  Name="rectangle1"
  Width="100" 
  Height="100"> 
  <Rectangle.Fill> 
    <SolidColorBrush Color="Blue"/> 
  </Rectangle.Fill>
</Rectangle>

Słownictwo XAML i programowanie obiektowe

Właściwości i zdarzenia wyświetlane jako elementy członkowskie XAML typu XAML środowiska uruchomieniowego systemu Windows są często dziedziczone z typów podstawowych. Rozważmy następujący przykład: <Button Background="Blue" .../>. Właściwość Background nie jest natychmiast zadeklarowaną właściwością w klasie Button . Zamiast tego Tło jest dziedziczone z podstawowej klasy Kontrola. W rzeczywistości, jeśli spojrzysz na temat odwołania Button, zobaczysz, że listy członków zawierają co najmniej jeden dziedziczony członek z każdego łańcucha kolejnych klas bazowych: ButtonBase, Control, FrameworkElement, UIElement, DependencyObject. Na liście Właściwości wszystkie właściwości do odczytu i zapisu oraz właściwości kolekcji są dziedziczone w kontekście słownictwa XAML. Zdarzenia (takie jak różne zdarzenia UIElement ) również są dziedziczone.

Jeśli korzystasz z dokumentacji środowiska uruchomieniowego Windows w celu uzyskania wskazówek dotyczących XAML, nazwa elementu wyświetlana w składni lub przykładowym kodzie często pochodzi od typu, który pierwotnie definiuje właściwość. Dzieje się tak, ponieważ ten temat referencyjny jest wspólny dla wszystkich możliwych typów dziedziczonych z klasy bazowej. Jeśli używasz funkcji IntelliSense programu Visual Studio dla języka XAML w edytorze XML, funkcja IntelliSense i jej listy rozwijane świetnie łączą dziedziczenie i dostarczają dokładną listę atrybutów, które możemy ustawić, gdy zaczynamy pracę z elementem obiektu dla instancji klasy.

Właściwości zawartości XAML

Niektóre typy definiują jedną z ich właściwości, tak aby właściwość umożliwiała składnię zawartości XAML. Dla właściwości zawartości XAML dla danego typu można pominąć definicję właściwości podczas określania jej w języku XAML. Można też ustawić właściwość na wartość tekstu wewnętrznego, podając ten tekst wewnętrzny bezpośrednio w tagach elementów obiektu typu będącego właścicielem. Właściwości zawartości XAML obsługują prostą składnię znaczników dla tej właściwości, co sprawia, że XAML jest bardziej czytelny dla człowieka, znacząco zmniejszając zagnieżdżanie.

Jeśli jest dostępna składnia zawartości XAML, ta składnia będzie wyświetlana w sekcjach "XAML" składni dla tej właściwości w dokumentacji referencyjnej środowiska uruchomieniowego systemu Windows. Na przykład strona właściwości Child dla Border pokazuje składnię zawartości XAML zamiast składni elementu właściwości, aby ustawić wartość pojedynczego obiektu Border.Child w następujący sposób:

<Border>
  <Button .../>
</Border>

Jeśli właściwość zadeklarowana jako właściwość zawartości XAML jest typem obiektu lub typem Ciąg, składnia zawartości XAML obsługuje tekst wewnętrzny w modelu dokumentów XML: ciąg między tagami otwierania i zamykania obiektu. Na przykład strona właściwości Text dla TextBlock pokazuje składnię zawartości XAML, która ma wewnętrzną wartość tekstową do ustawienia Text, ale ciąg "Text" nigdy nie pojawia się w znaczniku. Oto przykładowe użycie:

<TextBlock>Hello!</TextBlock>

Jeśli właściwość zawartości XAML istnieje dla klasy, jest to wskazane w temacie referencyjnym dla klasy, w sekcji "Atrybuty". Wyszukaj wartość atrybutu ContentPropertyAttribute. Ten atrybut używa nazwanego pola "Name". Wartość "Name" jest nazwą właściwości tej klasy, która jest właściwością zawartości XAML. Na przykład na stronie referencyjnej Border zobaczysz: ContentProperty("Name=Child").

Jedną z ważnych reguł składni języka XAML, którą należy wspomnieć, jest to, że nie można przeplatać właściwości zawartości XAML i innych elementów właściwości ustawionych na elemecie . Właściwość definiująca zawartość XAML musi być w pełni ustawiona przed wszystkimi elementami właściwości lub całkowicie po nich. Na przykład jest to nieprawidłowy kod XAML:

<StackPanel>
  <Button>This example</Button>
  <StackPanel.Resources>
    <SolidColorBrush x:Key="BlueBrush" Color="Blue"/>
  </StackPanel.Resources>
  <Button>... is illegal XAML</Button>
</StackPanel>

Składnia kolekcji

Wszystkie składnie pokazane do tej pory ustawiają właściwości dla pojedynczych obiektów. Jednak wiele scenariuszy interfejsu użytkownika wymaga, aby dany element nadrzędny mógł mieć wiele elementów podrzędnych. Na przykład interfejs użytkownika formularza wejściowego wymaga kilku elementów pola tekstowego, niektórych etykiet i być może przycisku "Prześlij". Mimo to, jeśli chcesz użyć modelu obiektów programowania w celu uzyskania dostępu do tych wielu elementów, zazwyczaj będą to elementy w jednej właściwości kolekcji, a nie każdy element jest wartością różnych właściwości. Język XAML obsługuje wiele elementów podrzędnych oraz typowy model wspierający kolekcję, traktując właściwości używające typu kolekcji jako niejawne i stosując specjalne traktowanie dla wszelkich elementów podrzędnych będących typem kolekcji.

Wiele właściwości kolekcji jest również identyfikowanych jako właściwość zawartości XAML dla klasy. Kombinacja niejawnego przetwarzania kolekcji i składni zawartości XAML jest często spotykana w typach używanych do komponowania kontrolek, takich jak panele, widoki lub elementy sterujące. Na przykład w poniższym przykładzie przedstawiono najprostszy możliwy kod XAML umożliwiający komponowanie dwóch równorzędnych elementów interfejsu użytkownika w elemencie StackPanel.

<StackPanel>
  <TextBlock>Hello</TextBlock>
  <TextBlock>World</TextBlock>
</StackPanel>

Mechanizm składni kolekcji XAML

Początkowo może się wydawać, że XAML umożliwia "ustawienie" właściwości kolekcji tylko do odczytu. W rzeczywistości język XAML umożliwia tutaj dodawanie elementów do istniejącej kolekcji. Język XAML i procesory XAML implementujące obsługę języka XAML opierają się na konwencji w typach kolekcji pomocniczych w celu włączenia tej składni. Zazwyczaj istnieje właściwość zapasowa, taka jak indeksator lub właściwość Items , która odwołuje się do określonych elementów kolekcji. Ogólnie rzecz biorąc, ta właściwość nie jest jawna w składni XAML. W przypadku kolekcji podstawowy mechanizm analizowania XAML nie jest właściwością, ale metodą: w szczególności metodą Add w większości przypadków. Gdy procesor XAML napotka jeden lub więcej elementów obiektu w składni kolekcji XAML, każdy z tych obiektów jest najpierw tworzony z elementu. Następnie każdy nowy obiekt jest dodawany w porządku do kolekcji zawierającej przez wywołanie metody Add kolekcji.

Gdy analizator XAML dodaje elementy do kolekcji, jest to logika metody Add , która określa, czy dany element XAML jest dopuszczalnym elementem podrzędnym obiektu kolekcji. Wiele typów kolekcji jest silnie typowanych przez implementację, co oznacza, że parametr wejściowy funkcji Add oczekuje, że przekazany typ musi być zgodny z typem parametru Add.

W przypadku właściwości kolekcji należy zachować ostrożność podczas próby jawnego określenia kolekcji jako elementu obiektu. Analizator XAML utworzy nowy obiekt za każdym razem, gdy napotka element obiektu. Jeśli właściwość kolekcji, której próbujesz użyć, jest tylko do odczytu, może wystąpić wyjątek parsowania XAML. Po prostu użyj niejawnej składni kolekcji, a nie zobaczysz tego wyjątku.

Kiedy należy używać składni atrybutu lub elementu właściwości

Wszystkie właściwości, które obsługują ustawianie w XAML, będą umożliwiały ustawianie wartości bezpośredniej za pomocą składni atrybutu lub elementu właściwości, ale potencjalnie nie będą obsługiwać obu tych składni zamiennie. Niektóre właściwości obsługują obie składnie, a inne właściwości oferują dodatkowe opcje składniowe, takie jak właściwość zawartości XAML. Typ składni XAML obsługiwanej przez właściwość zależy od typu obiektu, którego właściwość używa jako typu właściwości. Jeśli typ właściwości jest typem pierwotnym, takim jak double (zmiennoprzecinkowa lub dziesiętna), liczba całkowita, boolean lub ciąg, właściwość zawsze obsługuje składnię atrybutową.

Można również użyć składni atrybutu, aby ustawić właściwość, jeśli typ obiektu używany do ustawiania tej właściwości można utworzyć, przetwarzając ciąg. W przypadku typów prymitywnych jest tak zawsze, konwersja typu jest wbudowana w analizator. Jednak niektóre inne typy obiektów można również utworzyć przy użyciu ciągu określonego jako wartość atrybutu, a nie elementu obiektu w elemecie właściwości. Aby to zadziałało, musi istnieć konwersja typu bazowego obsługiwana przez tę właściwość lub obsługiwana ogólnie dla wszystkich wartości używających tego typu właściwości. Wartość ciągu atrybutu służy do ustawiania właściwości, które są ważne dla inicjowania nowej wartości obiektu. Potencjalnie określony konwerter typów może również utworzyć różne podklasy typu wspólnej właściwości, w zależności od tego, jak unikatowo przetwarza informacje w ciągu. Typy obiektów, które obsługują to zachowanie, będą miały specjalną gramatykę wymienioną w sekcji składni dokumentacji referencyjnej. Na przykład składnia XAML dla Brush pokazuje, jak składnia atrybutu może służyć do tworzenia nowej wartości SolidColorBrush dla dowolnej właściwości typu Brush (i istnieje wiele właściwości Brush w środowisku uruchomieniowym systemu Windows XAML).

Logika i reguły analizowania kodu XAML

Czasami warto odczytać XAML w podobny sposób, w jaki analizator XAML musi to robić: jako zestaw napotkanych ciągów znaków w kolejności liniowej. Analizator XAML musi interpretować te tokeny w ramach zestawu reguł, które są częścią definicji sposobu działania XAML.

Ustawienie wartości atrybutu to typowy sposób ustawiania wartości właściwości w języku znaczników, na przykład w języku XML lub HTML. W poniższej składni objectName jest obiektem, który chcesz utworzyć, właściwośćName jest nazwą właściwości, którą chcesz ustawić na tym obiekcie, a właściwośćValue jest wartością ustawioną.

<objectName propertyName="propertyValue" .../>

-or-

<objectName propertyName="propertyValue">

...<!--element children -->

</objectName>

Każda składnia umożliwia zadeklarowanie obiektu i ustawienie właściwości na tym obiekcie. Chociaż pierwszy przykład jest pojedynczym elementem w znaczniku, istnieją tu faktycznie odrębne kroki dotyczące sposobu, w jaki procesor XAML analizuje ten znacznik.

Najpierw obecność elementu object sygnalizuje konieczność zainicjowania nowego obiektu objectName. Tylko wtedy, gdy takie wystąpienie istnieje, można ustawić właściwość propertyName dla tego wystąpienia.

Kolejną regułą języka XAML jest to, że atrybuty elementu muszą być ustawione w dowolnej kolejności. Na przykład nie ma różnicy między wartościami <Rectangle Height="50" Width="100" /> i <Rectangle Width="100" Height="50" />. Której kolejności używasz, jest kwestią stylu.

Uwaga / Notatka

Projektanci XAML często promują konwencje porządkowania, jeśli używasz powierzchni projektowych innych niż edytor XML, ale możesz swobodnie edytować ten kod XAML później, aby zmienić kolejność atrybutów lub wprowadzić nowe.

Dołączone właściwości

Język XAML rozszerza kod XML przez dodanie elementu składni znanego jako dołączona właściwość. Podobnie jak składnia elementu właściwości, dołączona składnia właściwości zawiera kropkę, a kropka zawiera specjalne znaczenie dla analizy XAML. W szczególności kropka oddziela dostawcę dołączonej właściwości i nazwę właściwości.

W języku XAML ustawiasz dołączone właściwości przy użyciu składni AttachedPropertyProvider. PropertyName Oto przykład sposobu ustawiania dołączonej właściwości Canvas.Left w języku XAML:

<Canvas>
  <Button Canvas.Left="50">Hello</Button>
</Canvas>

Możesz ustawić dołączoną właściwość na elementach, które nie mają właściwości tej nazwy w typie kopii zapasowej, i w ten sposób działają nieco jak właściwość globalna lub atrybut zdefiniowany przez inną przestrzeń nazw XML, taką jak atrybut xml:space .

W środowisku uruchomieniowym systemu Windows XAML zobaczysz dołączone właściwości, które obsługują następujące scenariusze:

Aby uzyskać więcej informacji, zobacz Omówienie dołączonych właściwości.

Literał "{" wartości

Ponieważ symbol otwierającego nawiasu klamrowego { oznacza początek sekwencji rozszerzenia składniowego, należy użyć sekwencji znaków ucieczki, aby określić wartość ciągu znaków rozpoczynającą się od "{". Sekwencja ucieczki to "{}". Aby na przykład określić wartość ciągu, która jest pojedynczym nawiasem klamrowym otwierającym, określ wartość atrybutu jako "{}{". Możesz również użyć alternatywnych cudzysłowów (na przykład cudzysłowu ' w obrębie wartości atrybutu ograniczanej przez ""), aby podać wartość "{" jako ciąg znaków.

Uwaga / Notatka

Element "\}" działa również, jeśli znajduje się wewnątrz atrybutu cytowanego.  

Wartości wyliczenia

Wiele właściwości w interfejsie API środowiska uruchomieniowego systemu Windows używa wyliczeń do reprezentowania wartości. Jeśli element członkowski jest właściwością do odczytu i zapisu, można skonfigurować tę właściwość, podając wartość atrybutu. Należy określić, która wartość wyliczenia ma być używana jako wartość właściwości, używając niekwalifikowanej nazwy stałej . Na przykład poniżej przedstawiono sposób ustawiania UIElement.Visibility w języku XAML: <Button Visibility="Visible"/>. Tutaj ciąg "Visible" jest bezpośrednio mapowany na nazwaną stałą w enumeracji Widoczność, Visible.

  • Nie używaj kwalifikowanej formy, nie będzie działać. Na przykład jest to nieprawidłowy kod XAML: <Button Visibility="Visibility.Visible"/>.
  • Nie używaj wartości stałej. Innymi słowy, nie polegaj na wartości całkowitej wyliczenia, która jest określona jawnie lub niejawnie, w zależności od sposobu definiowania tego wyliczenia. Chociaż może się wydawać, że działa, jest to zła praktyka w języku XAML lub w kodzie, ponieważ polegasz na tym, co może być przejściowym szczegółem implementacji. Na przykład nie należy tego robić: <Button Visibility="1"/>.

Uwaga / Notatka

W tematach referencyjnych dla interfejsów API, które wykorzystują XAML i enumeracje, kliknij link do typu wyliczenia w sekcji Wartość właściwości w sekcji Składnia. Ta strona zawiera link do strony wyliczenia, gdzie można znaleźć nazwane stałe dla tego wyliczenia.

Wyliczenia mogą być flagowe, co oznacza, że są przypisywane za pomocą atrybutu FlagsAttribute. Jeśli musisz określić kombinację wartości dla wyliczenia flagowego jako wartość atrybutu w XAML, użyj nazw każdej stałej wyliczenia, oddzielając je przecinkami (,) i nie używając odstępów. Atrybuty flagowe nie są powszechne w słownictwie XAML środowiska uruchomieniowego systemu Windows, ale ManipulationModes jest przykładem, gdzie obsługiwane jest ustawienie wartości wyliczenia flagowego w XAML.

Interfejsy w języku XAML

W rzadkich przypadkach zobaczysz składnię XAML, w której typ właściwości jest interfejsem. W systemie typów XAML typ implementujący ten interfejs jest akceptowalny jako wartość podczas analizowania. Musi istnieć utworzone wystąpienie takiego typu, aby mogło służyć jako wartość. Zobaczysz interfejs używany jako typ w składni XAML dla właściwości Command i CommandParameterelementu ButtonBase. Te właściwości obsługują wzorce projektowe Model-View-ViewModel (MVVM), w których interfejs ICommand jest kontraktem określającym sposób interakcji widoków i modeli.

Konwencje dotyczące zastępników XAML w referencjach środowiska uruchomieniowego Windows

Jeśli znasz dowolną sekcję Składnia tematów referencyjnych dla interfejsów API środowiska uruchomieniowego systemu Windows, które mogą używać języka XAML, prawdopodobnie wiesz, że składnia zawiera sporo symboli zastępczych. Składnia XAML różni się od składni składników języka C#, Microsoft Visual Basic lub Visual C++ (C++/CX), ponieważ składnia XAML jest składnią użycia. Sugestia dotyczy potencjalnego użycia w Twoich własnych plikach XAML, ale bez nadmiernego narzucania możliwych wartości, które możesz zastosować. Zwykle użycie opisuje typ gramatyki, który miesza literały i symbole zastępcze, i definiuje niektóre symbole zastępcze w sekcji Wartości XAML .

Po wyświetleniu nazw typów/nazw elementów w składni XAML dla właściwości nazwa wyświetlana jest dla typu, który pierwotnie definiuje właściwość. Jednak język XAML środowiska uruchomieniowego systemu Windows obsługuje model dziedziczenia klas dla klas opartych na obiekcie DependencyObject. Dlatego często można użyć atrybutu w klasie, która nie jest dosłownie klasą definiującą, ale zamiast tego pochodzi z klasy, która najpierw zdefiniowała właściwość/atrybut. Można na przykład ustawić widoczność jako atrybut dla dowolnej klasy pochodnej UIElement przy użyciu głębokiego dziedziczenia. Na przykład: <Button Visibility="Visible" />. Nie należy więc przyjmować nazwy elementu wyświetlanej w żadnej składni użycia XAML zbyt dosłownie; Składnia może być opłacalna dla elementów reprezentujących klasę, a także elementów reprezentujących klasę pochodną. W przypadkach, gdy jest rzadkie lub niemożliwe, aby typ przedstawiony jako element definiujący był używany w rzeczywistych scenariuszach, nazwa tego typu jest celowo pisana małymi literami w składni. Na przykład składnia widoczna dla elementu UIElement.Visibility to :

<uiElement Visibility="Visible"/>
-or-
<uiElement Visibility="Collapsed"/>

Wiele sekcji składni XAML zawiera symbole zastępcze w sekcji "Użycie", które są następnie definiowane w sekcji Wartości XAML pod sekcją Składnia.

Sekcje użycia języka XAML używają również różnych uogólnionych symboli zastępczych. Te elementy zastępcze nie są redefiniowane za każdym razem w wartościach XAML, ponieważ z czasem zgadniesz lub dowiesz się, co reprezentują. Uważamy, że większość czytelników zmęczy się, widząc je ciągle w wartościach XAML, więc pominęliśmy je w definicjach. Poniżej przedstawiono listę niektórych z tych symboli zastępczych i to, co oznaczają w ogólnym sensie:

  • object: teoretycznie dowolna wartość obiektu, ale często praktycznie ograniczona do niektórych typów obiektów, takich jak wybór ciągu lub obiektu, i należy sprawdzić uwagi na stronie referencyjnej, aby uzyskać więcej informacji.
  • właściwośćobiektu: właściwośćobiektu w kombinacji jest stosowana w przypadkach, gdy wyświetlana składnia jest składnią typu, który może służyć jako wartość atrybutu dla wielu właściwości. Na przykład użycie atrybutu Xaml przedstawione dla Brush obejmuje: właściwość obiektu="predefinedColorName"/
  • eventhandler: Jest to wyświetlana jako wartość atrybutu dla każdej składni XAML wyświetlanej dla atrybutu zdarzenia. W tym miejscu podajesz nazwę funkcji obsługi zdarzeń. Ta funkcja musi być zdefiniowana w kodzie zaplecza dla strony XAML. Na poziomie programowania ta funkcja musi być zgodna z podpisem delegowanym zdarzenia obsługiwanego lub kod aplikacji nie zostanie skompilowany. Ale to naprawdę kwestia programowania, a nie kwestia XAML, więc nie staramy się sugerować nic o typie delegata w składni XAML. Jeśli chcesz wiedzieć, który delegat ma być implementowany dla zdarzenia, znajduje się to w sekcji Informacje o zdarzeniach tematu referencyjnego zdarzenia w wierszu tabeli z etykietą Delegat.
  • enumMemberName: pokazywane w składni atrybutowej dla wszystkich wyliczeń. Istnieje podobny symbol zastępczy dla właściwości używających wartości wyliczenia, ale zwykle poprzedza symbol zastępczy podpowiedzią nazwy wyliczenia. Na przykład składnia wyświetlana dla FrameworkElement.FlowDirection to <frameworkElementFlowDirection="flowDirectionMemberName"/>. Jeśli korzystasz z jednej ze stron odniesienia właściwości, kliknij link do typu wyliczenia, który widnieje w części Wartość właściwości obok tekstu Type:. Dla wartości atrybutu właściwości, która używa tego wyliczenia, można użyć dowolnego ciągu wymienionego w kolumnie Member listy Członkowie .
  • double, int, string, bool: są to typy pierwotne znane językowi XAML. Jeśli programujesz przy użyciu języka C# lub Visual Basic, te typy są projektowane dla równoważnych typów platformy Microsoft .NET, takich jak Double, Int32, String i Boolean, i można użyć dowolnych elementów członkowskich w tych typach .NET podczas pracy z wartościami zdefiniowanymi przez XAML w kodzie platformy .NET. Jeśli programujesz przy użyciu języka C++/CX, użyjesz typów pierwotnych języka C++, ale możesz również rozważyć te typy równoważne typom zdefiniowanym przez przestrzeń nazw platformy , na przykład Platform::String. Czasami będą istnieć dodatkowe ograniczenia wartości dla określonych właściwości. Te informacje są jednak zwykle widoczne w sekcji Wartość właściwości lub uwagi, a nie w sekcji XAML, ponieważ wszelkie takie ograniczenia dotyczą użycia kodu i użycia kodu XAML.

Porady i wskazówki, uwagi dotyczące stylu

  • Rozszerzenia znaczników są ogólnie opisane w głównym omówieniu języka XAML. Jednak rozszerzenie znaczników, które ma największy wpływ na wskazówki podane w tym temacie, jest rozszerzenie znaczników StaticResource (i powiązane ThemeResource). Funkcja rozszerzenia znaczników StaticResource umożliwia uwzględnienie kodu XAML w zasobach wielokrotnego użytku, które pochodzą z elementu ResourceDictionary XAML. Niemal zawsze definiujesz szablony kontrolek i powiązane style w obiekcie ResourceDictionary. Często definiujesz mniejsze części definicji szablonu kontrolki lub stylu specyficznego dla aplikacji w kodzie ResourceDictionary , na przykład SolidColorBrush dla koloru używanego przez aplikację więcej niż raz dla różnych części interfejsu użytkownika. Korzystając z elementu StaticResource, każda właściwość, która w przeciwnym razie wymaga użycia elementu właściwości do ustawienia, można teraz ustawić w składni atrybutu. Jednak zalety faktoringu XAML do ponownego użycia wykraczają poza uproszczenie składni na poziomie strony. Aby uzyskać więcej informacji, zobacz ResourceDictionary i odniesienia do zasobów XAML.
  • Zobaczysz kilka różnych konwencji dotyczących sposobu stosowania białych znaków i kanałów informacyjnych wierszy w przykładach XAML. W szczególności istnieją różne konwencje podziału elementów obiektów, które mają wiele różnych zestawów atrybutów. To tylko kwestia stylu. Edytor XML programu Visual Studio stosuje niektóre domyślne reguły stylu podczas edytowania kodu XAML, ale można je zmienić w ustawieniach. Istnieje niewielka liczba przypadków, w których biały znak w pliku XAML jest uznawany za znaczący; Aby uzyskać więcej informacji, zobacz XAML i białe znaki.