Omówienie języka XAML

XAML (extensible Application Markup Language) to deklaratywny język znaczników używany do definiowania interfejsu użytkownika w aplikacjach WinUI. Strukturę i właściwości interfejsu użytkownika opisujesz w plikach .xaml, a logikę i zdarzenia obsługujesz w skojarzonym pliku kodu zaplecza.

Co to jest XAML?

XAML to język oparty na języku XML do tworzenia obiektów i ustawiania ich właściwości. Elementy interfejsu użytkownika — przyciski, pola tekstowe, układy — deklarujesz w znacznikach, a do reagowania na zdarzenia i manipulowania tymi elementami w czasie wykonywania używasz pliku code-behind.

Ponieważ XAML jest tekstowym formatem wymiany, projektanci i programiści mogą pracować niezależnie: projektanci tworzą strukturę wizualną w języku XAML, programiści implementują logikę w kodzie zaplecza (code-behind), a obie strony mogą wprowadzać kolejne zmiany bez wzajemnego blokowania się.

Podstawowa składnia XAML

Cały prawidłowy kod XAML jest również prawidłowym kodem XML, ale XAML dodaje własne pojęcia. Na przykład składnia elementu właściwości umożliwia ustawienie właściwości jako zagnieżdżonego elementu XML, a nie ciągu atrybutu — prawidłowy kod XML, ale z dodatkowym znaczeniem w języku XAML.

Aby uzyskać szczegółowe informacje o składni, zobacz Przewodnik składni języka XAML.

XAML i Visual Studio

Edytor XAML programu Visual Studio udostępnia funkcję IntelliSense, automatyczne uzupełnianie oraz wizualny projektant. Błędy są wyświetlane w tekście jako zygzaki przed skompilowanie. Nie musisz zapamiętywać każdej reguły składni — niech środowisko IDE cię poprowadzi.

Przestrzenie nazw XAML

Każdy plik XAML deklaruje przestrzenie nazw w elemencie głównym. Typowa strona WinUI zaczyna się od dwóch:

<Page
    x:Class="Application1.BlankPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
>
  • Domyślna przestrzeń nazw (xmlns=): zawiera wszystkie wbudowane kontrolki WinUI, tekst, grafika, powiązanie danych i typy stylów. Większość kodu XAML używa tej przestrzeni nazw bez prefiksu.
  • Przestrzeń nazw języka XAML (xmlns:x=): mapowana na prefiks x:, zapewnia podstawowe funkcje języka.

Przestrzeń x: nazw

Attribute Purpose
x:Key Unikalny klucz zasobu w ResourceDictionary
x:Class Łączy plik XAML z jego klasą code-behind
x:Name Przypisuje nazwę środowiska uruchomieniowego, aby kod mógł odwoływać się do elementu
x:Uid Oznacza elementy zlokalizowanego podstawienia zasobów
Typy wewnętrzne XAML Wyraża proste wartości (na przykład x:Boolean) jako elementy obiektu

Mapowanie typów niestandardowych

Aby używać własnych typów lub typów bibliotek innych firm w kodzie XAML, zadeklaruj prefiks przestrzeni nazw, który odpowiada przestrzeni nazw kodu:

xmlns:myTypes="using:myCompany.myTypes"

Następnie odwołaj się do tych typów z prefiksem:

<myTypes:CustomButton/>

Aby uzyskać szczegółowe informacje, w tym zagadnienia dotyczące języka C++/CX, zobacz Przestrzenie nazw XAML i mapowanie przestrzeni nazw.

Przestrzenie nazw projektanta i zgodności

W kodzie XAML generowanym przez narzędzia często można zobaczyć prefiksy d: (projektant) i mc: (zgodność znaczników). Służą do obsługi narzędzi projektowych i można je bezpiecznie ignorować w czasie działania. Aby uzyskać szczegółowe informacje, zobacz Inne przestrzenie nazw XAML.

Rozszerzenia znaczników

Rozszerzenia znaczników umożliwiają ustawienie właściwości na coś, czego nie można wyrazić jako zwykłego ciągu — na przykład odwołanie do zasobu udostępnionego lub powiązania danych. Używają składni nawiasu klamrowego:

<Button Style="{StaticResource SearchButtonStyle}"/>

Bez {StaticResource} trzeba użyć rozbudowanej składni elementu właściwości, aby przypisać Style. Rozszerzenia znaczników pozwalają zachować zwięzłość kodu XAML.

środowisko wykonawcze systemu Windows XAML obsługuje następujące rozszerzenia znaczników:

Extension Purpose
{x:Bind} Powiązanie danych w czasie kompilacji (najlepsza wydajność)
{Binding} Powiązanie danych środowiska uruchomieniowego
{StaticResource} Odwołuje się do wpisu ResourceDictionary za pomocą klucza
{ThemeResource} Podobnie jak {StaticResource}, ale aktualizuje się, gdy motyw aplikacji ulegnie zmianie
{TemplateBinding} Wiązanie z właściwością elementu nadrzędnego szablonu kontrolki
{RelativeSource} Wiązanie względem szablonu nadrzędnego
{CustomResource} Zaawansowane wyszukiwanie zasobów niestandardowych
{x:Null} Jawnie ustaw wartość dopuszczaną do wartości null null

Rozszerzenia znaczników mogą być zagnieżdżane; to najbardziej zagnieżdżone jest oceniane jako pierwsze.

Events

Dołącz programy obsługi zdarzeń w języku XAML, określając zdarzenie jako atrybut i nazwę metody obsługi jako jego wartość:

<Button Click="showUpdatesButton_Click">Show updates</Button>

Kompilator oczekuje odpowiedniej metody w pliku code-behind z prawidłowym podpisem delegata:

private void showUpdatesButton_Click(object sender, RoutedEventArgs e)
{
    // your code
}
void showUpdatesButton_Click(Windows::Foundation::IInspectable const&, Microsoft::UI::Xaml::RoutedEventArgs const&);

Uwaga / Notatka

W języku C++/CX każda strona XAML ma dwa pliki z kodem: nagłówek (.xaml.h) i implementację (.xaml.cpp).

Aby uzyskać więcej informacji, zobacz Omówienie zdarzeń i zdarzeń kierowanych.

Słowniki zasobów

ResourceDictionary przechowuje obiekty wielokrotnego użytku — pędzle, style, szablony — identyfikowane za pomocą x:Key. Zasoby mogą znajdować się w sekcji zasobów strony lub w osobnym .xaml pliku. Aby uzyskać pełne wyjaśnienie, zobacz temat ResourceDictionary i odwołania do zasobów XAML.

XAML i XML

XAML to nadzbiór kodu XML z kilkoma elementami, które należy znać:

  • Uwzględniana wielkość liter: nazwy elementów i atrybutów muszą być dokładnie zgodne.
  • xml:lang: Prawidłowy w języku XAML, ale odpowiada zachowaniu środowiska uruchomieniowego na poziomie frameworka, a nie zachowaniu parsera.
  • Kodowanie: obsługiwane są tylko formaty UTF-8 i UTF-16.

Zakresy nazw XAML

Nazwy przypisane za pomocą x:Name muszą być unikatowe w ich zakresie nazw. Zakresy nazw są szczególnie istotne wewnątrz szablonów kontrolek, gdzie nazwy są ograniczone do szablonu, a nie do strony. Aby uzyskać szczegółowe informacje, zobacz XAML namescopes (Zakresy nazw XAML).

Porady dotyczące wydajności

  • Definiuj często używane pędzle jako zasoby SolidColorBrush zamiast powtarzać literały kolorów.
  • Umieść zasoby współdzielone między stronami w Application.Resources; zasoby właściwe dla danej strony pozostaw lokalnie na tej stronie.
  • Przed wysyłką usuń nieużywane zasoby (klucze bez {StaticResource} odwołań).
  • Unikaj zastępowania szablonów kontrolek — wartości domyślne są już zoptymalizowane pod kątem wydajności ładowania.
  • Używaj Border i kontenerów układu zamiast rysować ten sam piksel wiele razy (nadmiarowe rysowanie).
  • Użyj domyślnych szablonów elementów dla ListView i GridView; logika Presenter jest zoptymalizowana pod kątem dużych list.

Aby uzyskać więcej wskazówek, zobacz Optymalizowanie znaczników XAML.

Debugowanie kodu XAML

Nie można ustawić punktów przerwania w .xaml plikach, ale Visual Studio zapewnia inną pomoc:

  • Czas projektowania: znaczniki błędów i zygzaki są wyświetlane w tekście podczas wpisywania.
  • Środowisko uruchomieniowe: Niepowodzenia parsowania powodują zgłoszenie wyjątku XamlParseException (lub podobnego wyjątku strukturalnego w języku C++/CX) z kontekstem numeru wiersza w pliku XAML.

Aby uzyskać informacje na temat obsługi błędów w czasie wykonywania, zobacz Obsługa wyjątków dla aplikacji WinUI w języku C# lub Visual Basic. Aby rozpocząć sesję debugowania, zobacz Rozpoczynanie sesji debugowania.