Платформозависимость в XAML

Последнее обновление: 11.01.2021

Для определения платформозависимых значений свойств применяется класс OnPlatform<T>. Например, нам надо для каждой платформы установить свой текст и цвет текста элемента Label:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="HelloApp.MainPage">
  <Label VerticalOptions="Center" HorizontalOptions="Center">
    
	<Label.Text>
      <OnPlatform x:TypeArguments="x:String"
         iOS ="iOS"
         Android ="Android"
         WinPhone="Windows 10"
    />
    </Label.Text>
  
	<Label.TextColor>
      <OnPlatform x:TypeArguments="Color"
         iOS ="Yellow"
         Android ="Green"
         WinPhone="Red"
    />
    </Label.TextColor>
  </Label>
</ContentPage>

В качестве значения свойства Text и TextColor принимают объект OnPlatform. Чтобы указать, значения какого типа должны быть переданы, применяется атрибут x:TypeArguments. Например, свойство Text в качестве значения принимает строку, то есть объект типа String, поэтому устанавливаем x:TypeArguments="x:String". А свойство TextColor принимает объект Color, поэтому пишем x:TypeArguments="Color"

Следующий набор атрибутов: iOS, Android и WinPhone устанавливают значения для каждой операционной системы. Значение WinPhone распространяется не только на Windows Phone, но и на десктопные версии Windows.

Также мы можем расписать определение OnPlatform более подробно, если, к примеру, мы должны передавать какой-то сложный объект. Например, свойство Padding, которое устанавливает внутренние отступы страницы, принимает объект Thickness:

<ContentPage.Padding>
    <OnPlatform x:TypeArguments="Thickness">
      <OnPlatform.iOS>
          <Thickness Left="0" Top="20" Right="0" Bottom="0" />
       </OnPlatform.iOS>
       <OnPlatform.Android>
         <Thickness Left="0" Top="0" Right="0" Bottom="0" />
       </OnPlatform.Android>
       <OnPlatform.WinPhone>
         <Thickness Left="0" Top="0" Right="0" Bottom="0" />
       </OnPlatform.WinPhone>
    </OnPlatform>
</ContentPage.Padding>

Правда, в данном случае надо заметить, что настройки для Windows и Android принимают значения по умолчанию, то есть нулевые отступы от каждой стороны страницы. Изменения касаются лишь iOS. Поэтому в данном случае мы можем сократить установку Padding:

<ContentPage.Padding>
    <OnPlatform x:TypeArguments="Thickness"
         iOS="0,20,0,0"
    />
</ContentPage.Padding>
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850