Podstawowa składnia XAML
Język XAML jest przeznaczony głównie do tworzenia wystąpień i inicjowania obiektów. Jednak często właściwości muszą być ustawione na obiekty złożone, których nie można łatwo przedstawić jako ciągów XML, a czasami właściwości zdefiniowane przez jedną klasę muszą być ustawione w klasie podrzędnej. Te dwa potrzeby wymagają podstawowych funkcji składni XAML elementów właściwości i dołączonych właściwości.
Elementy właściwości
W wieloplatformowym interfejsie użytkownika aplikacji platformy .NET (.NET MAUI) XAML właściwości klas są zwykle ustawiane jako atrybuty XML:
<Label Text="Hello, XAML!"
VerticalOptions="Center"
FontAttributes="Bold"
FontSize="18"
TextColor="Aqua" />
Istnieje jednak alternatywny sposób ustawiania właściwości w języku XAML:
<Label Text="Hello, XAML!"
VerticalOptions="Center"
FontAttributes="Bold"
FontSize="18">
<Label.TextColor>
Aqua
</Label.TextColor>
</Label>
Te dwa przykłady określające TextColor
właściwość są funkcjonalnie równoważne i umożliwiają wprowadzenie pewnych podstawowych terminologii:
- Labeljest elementem obiektu. Jest to obiekt MAUI platformy .NET wyrażony jako element XML.
Text
,VerticalOptions
iFontSize
są atrybutami właściwości.FontAttributes
Są to właściwości MAUI platformy .NET wyrażone jako atrybuty XML.- W drugim przykładzie
TextColor
stał się elementem właściwości. Jest to właściwość MAUI platformy .NET wyrażona jako element XML.
Uwaga
W elemecie właściwości wartość właściwości jest zawsze definiowana jako zawartość między tagami start-element-property i end.
Składnia elementu właściwości może być również używana w więcej niż jednej właściwości obiektu:
<Label Text="Hello, XAML!"
VerticalOptions="Center">
<Label.FontAttributes>
Bold
</Label.FontAttributes>
<Label.FontSize>
Large
</Label.FontSize>
<Label.TextColor>
Aqua
</Label.TextColor>
</Label>
Chociaż składnia właściwości-elementu może wydawać się niepotrzebna, ważne jest, aby wartość właściwości była zbyt złożona, aby była wyrażana jako prosty ciąg. W tagach property-element można utworzyć wystąpienie innego obiektu i ustawić jego właściwości. Na przykład Grid układ ma właściwości o nazwie RowDefinitions
i ColumnDefinitions
, które są odpowiednio typu RowDefinitionCollection
i ColumnDefinitionCollection
. Te typy to kolekcje RowDefinition
obiektów i ColumnDefinition
, a składnia elementu właściwości jest zwykle używana do ich ustawiania:
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="XamlSamples.GridDemoPage"
Title="Grid Demo Page">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
<RowDefinition Height="100" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="100" />
</Grid.ColumnDefinitions>
...
</Grid>
</ContentPage>
Dołączone właściwości
W poprzednim przykładzie pokazano, że Grid element właściwości wymaga elementów RowDefinitions
właściwości dla kolekcji i ColumnDefinitions
do zdefiniowania wierszy i kolumn. Sugeruje to, że musi istnieć technika wskazująca wiersz i kolumnę, w której znajduje się każde dziecko.Grid
W tagu dla każdego elementu podrzędnego określ wiersz i kolumnę tego elementu podrzędnego Grid przy użyciu Grid.Row
atrybutów i Grid.Column
, które mają wartości domyślne 0. Można również wskazać, czy element podrzędny obejmuje więcej niż jeden wiersz lub kolumnę z atrybutami Grid.RowSpan
i Grid.ColumnSpan
, które mają wartości domyślne 1.
W poniższym przykładzie pokazano umieszczenie elementów podrzędnych w obiekcie Grid:
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="XamlSamples.GridDemoPage"
Title="Grid Demo Page">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
<RowDefinition Height="100" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="100" />
</Grid.ColumnDefinitions>
<Label Text="Autosized cell"
TextColor="White"
BackgroundColor="Blue" />
<BoxView Color="Silver"
Grid.Column="1" />
<BoxView Color="Teal"
Grid.Row="1" />
<Label Text="Leftover space"
Grid.Row="1" Grid.Column="1"
TextColor="Purple"
BackgroundColor="Aqua"
HorizontalTextAlignment="Center"
VerticalTextAlignment="Center" />
<Label Text="Span two rows (or more if you want)"
Grid.Column="2" Grid.RowSpan="2"
TextColor="Yellow"
BackgroundColor="Blue"
HorizontalTextAlignment="Center"
VerticalTextAlignment="Center" />
<Label Text="Span two columns"
Grid.Row="2" Grid.ColumnSpan="2"
TextColor="Blue"
BackgroundColor="Yellow"
HorizontalTextAlignment="Center"
VerticalTextAlignment="Center" />
<Label Text="Fixed 100x100"
Grid.Row="2" Grid.Column="2"
TextColor="Aqua"
BackgroundColor="Red"
HorizontalTextAlignment="Center"
VerticalTextAlignment="Center" />
</Grid>
</ContentPage>
Ten kod XAML powoduje następujący układ:
Atrybuty , , i wydają się być właściwościami Grid klasy, ale ta klasa nie definiuje niczego o nazwie Row
, , Column
RowSpan
lub ColumnSpan
.Grid.ColumnSpan
Grid.RowSpan
Grid.Column
Grid.Row
Grid Zamiast tego klasa definiuje cztery właściwości możliwe do powiązania o nazwach RowProperty
, ColumnProperty
, RowSpanProperty
i ColumnSpanProperty
, które są specjalnymi typami powiązanych właściwości znanych jako dołączone właściwości. Są one definiowane przez klasę Grid , ale ustawiane dla elementów podrzędnych klasy Grid.
Uwaga
Jeśli chcesz użyć tych dołączonych właściwości w kodzie, Grid klasa udostępnia metody statyczne o nazwie GetRow
, , SetRow
, SetColumn
GetColumn
SetRowSpan
GetRowSpan
, GetColumnSpan
, i .SetColumnSpan
Dołączone właściwości są rozpoznawalne w języku XAML jako atrybuty zawierające zarówno klasę, jak i nazwę właściwości oddzieloną kropką. Są one nazywane dołączonymi właściwościami , ponieważ są definiowane przez jedną klasę (w tym przypadku Grid), ale dołączone do innych obiektów (w tym przypadku elementów podrzędnych klasy Grid). Podczas układu program może przesłuchić wartości tych dołączonych właściwości, Grid aby wiedzieć, gdzie umieścić poszczególne elementy podrzędne.
Właściwości zawartości
W poprzednim przykładzie Grid obiekt został ustawiony na Content
właściwość ContentPage. Jednak właściwość nie odwoływała się do kodu XAML, Content
ale może być następująca:
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="XamlSamples.XamlPlusCodePage"
Title="XAML + Code Page">
<ContentPage.Content>
<Grid>
...
</Grid>
</ContentPage.Content>
</ContentPage>
Właściwość nie jest wymagana Content
w języku XAML, ponieważ elementy zdefiniowane do użycia w języku .NET MAUI XAML mogą mieć jedną właściwość określoną jako ContentProperty
atrybut klasy:
[ContentProperty("Content")]
public class ContentPage : TemplatedPage
{
...
}
Każda właściwość określona jako ContentProperty
klasa oznacza, że tagi property-element dla właściwości nie są wymagane. W związku z tym powyższy przykład określa, że do właściwości jest przypisywana dowolna zawartość XAML wyświetlana między tagami początkowymi i końcowymi ContentPage Content
.
Wiele klas ma ContentProperty
również definicje atrybutów. Na przykład właściwość content obiektu Label to Text
.
Różnice między platformami
Aplikacje MAUI platformy .NET mogą dostosowywać wygląd interfejsu użytkownika dla poszczególnych platform. Można to osiągnąć w języku XAML przy użyciu OnPlatform
klas i :On
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="...">
<ContentPage.Padding>
<OnPlatform x:TypeArguments="Thickness">
<On Platform="iOS" Value="0,20,0,0" />
<On Platform="Android" Value="10,20,20,10" />
</OnPlatform>
</ContentPage.Padding>
...
</ContentPage>
OnPlatform
jest klasą ogólną i dlatego należy określić argument typu ogólnego, w tym przypadku , Thickness
który jest typem Padding
właściwości. Jest to osiągane za pomocą atrybutu x:TypeArguments
XAML. Klasa OnPlatform
definiuje Default
właściwość, którą można ustawić na wartość, która zostanie zastosowana do wszystkich platform:
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="...">
<ContentPage.Padding>
<OnPlatform x:TypeArguments="Thickness" Default="20">
<On Platform="iOS" Value="0,20,0,0" />
<On Platform="Android" Value="10,20,20,10" />
</OnPlatform>
</ContentPage.Padding>
...
</ContentPage>
W tym przykładzie Padding
właściwość jest ustawiana na różne wartości w systemach iOS i Android, a inne platformy są ustawione na wartość domyślną.
Klasa OnPlatform
definiuje również właściwość , która jest obiektem IList
On
.Platforms
Każdy On
obiekt może ustawić Platform
właściwość i Value
, aby zdefiniować Thickness
wartość dla określonej platformy. Ponadto Platform
właściwość typu On
jest typu IList<string>
, więc można uwzględnić wiele platform, jeśli wartości są takie same:
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="...">
<ContentPage.Padding>
<OnPlatform x:TypeArguments="Thickness" Default="20">
<On Platform="iOS, Android" Value="10,20,20,10" />
</OnPlatform>
</ContentPage.Padding>
...
</ContentPage>
Jest to standardowy sposób ustawiania właściwości zależnej od Padding
platformy w języku XAML.
Uwaga
Value
Jeśli właściwość On
obiektu nie może być reprezentowana przez pojedynczy ciąg, możesz zdefiniować dla niego elementy właściwości.
Aby uzyskać więcej informacji, zobacz Dostosowywanie wyglądu interfejsu użytkownika na podstawie platformy.
Następne kroki
Rozszerzenia znaczników XAML dla platformy .NET MAUI umożliwiają ustawianie właściwości na obiekty lub wartości, do których odwołuje się pośrednio z innych źródeł. Rozszerzenia znaczników XAML są szczególnie ważne w przypadku udostępniania obiektów i odwoływania się do stałych używanych w całej aplikacji.