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:
Elementy podrzędne mogą informować nadrzędne panele kontenerowe, jak powinny działać w układzie: Canvas , Grid , VariableSizedWrapGrid .
Użycie kontrolek może mieć wpływ na zachowanie ważnej części kontrolki pochodzącej z szablonu kontrolki: ScrollViewer , VirtualizingStackPanel .
Użycie usługi dostępnej w powiązanej klasie, w której usługa i klasa, która jej używa, nie współużytkują dziedziczenia: Typography , VisualStateManager , AutomationProperties , ToolTipService .
Docelowanie animacji: Storyboard .
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 CommandParameter elementu 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 <frameworkElement FlowDirection ="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 .