Передача аргументов

Часто необходимо создавать экземпляры объектов с конструкторами, которым требуются аргументы или вызывать статический метод создания. Это можно сделать в XAML многоплатформенного пользовательского интерфейса приложений .NET (.NET MAUI) с помощью x:Arguments атрибутов:x:FactoryMethod

  • Атрибут x:Arguments используется для указания аргументов конструктора для конструктора, отличного от по умолчанию, или для объявления объекта метода фабрики. Дополнительные сведения см. в разделе "Аргументы конструктора передачи".
  • Атрибут x:FactoryMethod используется для указания метода фабрики, который можно использовать для инициализации объекта. Дополнительные сведения см. в разделе "Методы фабрики вызовов".

Кроме того, x:TypeArguments атрибут можно использовать для указания аргументов универсального типа конструктору универсального типа. Дополнительные сведения см. в разделе "Указание аргумента универсального типа".

Аргументы можно передать конструкторам и методам фабрики с помощью следующих примитивов языка XAML .NET MAUI:

  • x:Array, соответствующий Array.
  • x:Boolean, соответствующий Boolean.
  • x:Byte, соответствующий Byte.
  • x:Char, соответствующий Char.
  • x:DateTime, соответствующий DateTime.
  • x:Decimal, соответствующий Decimal.
  • x:Double, соответствующий Double.
  • x:Int16, соответствующий Int16.
  • x:Int32, соответствующий Int32.
  • x:Int64, соответствующий Int64.
  • x:Object, соответствующий параметру Object.
  • x:Single, соответствующий Single.
  • x:String, соответствующий String.
  • x:TimeSpan, соответствующий TimeSpan.

Кроме того x:DateTime, другие примитивы языка находятся в спецификации XAML 2009.

Примечание.

Примитив x:Single языка можно использовать для передачи float аргументов.

Передача аргументов конструктора

Аргументы можно передать в конструктор, отличный от по умолчанию, с помощью атрибута x:Arguments . Каждый аргумент конструктора должен быть разделен в xml-элементе, который представляет тип аргумента.

В следующем примере показано использование атрибута x:Arguments с тремя разными Color конструкторами:

<BoxView HeightRequest="150"
         WidthRequest="150"
         HorizontalOptions="Center">
    <BoxView.Color>
        <Color>
            <x:Arguments>
                <x:Single>0.9</x:Single>
            </x:Arguments>
        </Color>
    </BoxView.Color>
</BoxView>
<BoxView HeightRequest="150"
         WidthRequest="150"
         HorizontalOptions="Center">
    <BoxView.Color>
        <Color>
            <x:Arguments>
                <x:Single>0.25</x:Single>
                <x:Single>0.5</x:Single>
                <x:Single>0.75</x:Single>
            </x:Arguments>
        </Color>
    </BoxView.Color>
</BoxView>
<BoxView HeightRequest="150"
         WidthRequest="150"
         HorizontalOptions="Center">
    <BoxView.Color>
        <Color>
            <x:Arguments>
                <x:Single>0.8</x:Single>
                <x:Single>0.5</x:Single>
                <x:Single>0.2</x:Single>
                <x:Single>0.5</x:Single>
            </x:Arguments>
        </Color>
    </BoxView.Color>
</BoxView>

Количество элементов в теге x:Arguments и типы этих элементов должны соответствовать одному из Color конструкторов. Конструктор Color с одним параметром float требует от 0 (черного) до 1 (белого). Конструктор Color с тремя параметрами требует float красных, зеленых и синих значений от 0 до 1. Конструктор Color с четырьмя параметрами добавляет float альфа-канал в качестве четвертого параметра.

Методы фабрики вызовов

Методы фабрики можно вызывать в XAML .NET MAUI, указав имя метода с помощью x:FactoryMethod атрибута и его аргументы с помощью атрибута x:Arguments . Метод фабрики — это public static метод, который возвращает объекты или значения того же типа, что и класс или структура, определяющие методы.

Класс Color определяет ряд методов фабрики, а следующий пример демонстрирует вызов трех из них:

<BoxView HeightRequest="150"
         WidthRequest="150"
         HorizontalOptions="Center">
  <BoxView.Color>
    <Color x:FactoryMethod="FromRgba">
      <x:Arguments>
        <x:Byte>192</x:Byte>
        <x:Byte>75</x:Byte>
        <x:Byte>150</x:Byte>
        <x:Byte>128</x:Byte>
      </x:Arguments>
    </Color>
  </BoxView.Color>
</BoxView>
<BoxView HeightRequest="150"
         WidthRequest="150"
         HorizontalOptions="Center">
  <BoxView.Color>
    <Color x:FactoryMethod="FromHsla">
      <x:Arguments>
        <x:Double>0.23</x:Double>
        <x:Double>0.42</x:Double>
        <x:Double>0.69</x:Double>
        <x:Double>0.7</x:Double>
      </x:Arguments>
    </Color>
  </BoxView.Color>
</BoxView>
<BoxView HeightRequest="150"
         WidthRequest="150"
         HorizontalOptions="Center">
  <BoxView.Color>
    <Color x:FactoryMethod="FromHex">
      <x:Arguments>
        <x:String>#FF048B9A</x:String>
      </x:Arguments>
    </Color>
  </BoxView.Color>
</BoxView>

Количество элементов в теге x:Arguments и типы этих элементов должны соответствовать аргументам вызываемого метода фабрики. Метод FromRgba фабрики требует четырех byte аргументов, представляющих красные, зеленые, синие и альфа-значения, от 0 до 255 соответственно. Метод FromHsla фабрики требует четырех float аргументов, представляющих оттенки, насыщенность, светимость и альфа-значения, от 0 до 1 соответственно. Для FromHex метода фабрики требуется аргумент, представляющий шестнадцатеричный string цвет RGB.

Указание аргумента универсального типа

Аргументы универсального типа для конструктора универсального типа можно указать с помощью x:TypeArguments атрибута, как показано в следующем примере:

<StackLayout>
    <StackLayout.Margin>
        <OnPlatform x:TypeArguments="Thickness">
          <On Platform="iOS" Value="0,20,0,0" />
          <On Platform="Android" Value="5, 10" />
        </OnPlatform>
    </StackLayout.Margin>
</StackLayout>

Класс OnPlatform является универсальным классом и должен быть создан с помощью атрибута x:TypeArguments , соответствующего целевому типу. On В классе Platform атрибут может принимать одно string значение или несколько значений с разделителями-запятымиstring. В этом примере StackLayout.Margin свойство имеет значение для конкретной Thicknessплатформы.

Дополнительные сведения о аргументах универсального типа см. в разделе "Универсальные" в XAML.