Condividi tramite


Passaggio di argomenti in XAML

Questo articolo illustra l'uso degli attributi XAML che possono essere usati per passare argomenti a costruttori non predefiniti, per chiamare i metodi factory e per specificare il tipo di un argomento generico.

Panoramica

Spesso è necessario creare un'istanza di oggetti con costruttori che richiedono argomenti o chiamando un metodo di creazione statica. Questa operazione può essere ottenuta in XAML usando gli x:Arguments attributi e x:FactoryMethod :

  • L'attributo x:Arguments viene usato per specificare gli argomenti del costruttore per un costruttore non predefinito o per una dichiarazione di oggetto metodo factory. Per altre informazioni, vedere Passaggio di argomenti del costruttore.
  • L'attributo x:FactoryMethod viene utilizzato per specificare un metodo factory che può essere utilizzato per inizializzare un oggetto . Per altre informazioni, vedere Chiamata di metodi factory.

Inoltre, l'attributo x:TypeArguments può essere usato per specificare gli argomenti di tipo generico per il costruttore di un tipo generico. Per altre informazioni, vedere Specifica di un argomento di tipo generico.

Passaggio di argomenti del costruttore

Gli argomenti possono essere passati a un costruttore non predefinito usando l'attributo x:Arguments . Ogni argomento del costruttore deve essere delimitato all'interno di un elemento XML che rappresenta il tipo dell'argomento. Xamarin.Forms supporta gli elementi seguenti per i tipi di base:

  • x:Array
  • x:Boolean
  • x:Byte
  • x:Char
  • x:DateTime
  • x:Decimal
  • x:Double
  • x:Int16
  • x:Int32
  • x:Int64
  • x:Object
  • x:Single
  • x:String
  • x:TimeSpan

L'esempio di codice seguente illustra l'uso dell'attributo x:Arguments con tre Color costruttori:

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

Il numero di elementi all'interno del x:Arguments tag e i tipi di questi elementi devono corrispondere a uno dei Color costruttori. Il Color costruttore con un singolo parametro richiede un valore in scala di grigi compreso tra 0 (nero) e 1 (bianco). Il Color costruttore con tre parametri richiede un valore rosso, verde e blu compreso tra 0 e 1. Il Color costruttore con quattro parametri aggiunge un canale alfa come quarto parametro.

Gli screenshot seguenti mostrano il risultato della chiamata di ogni Color costruttore con i valori dell'argomento specificati:

BoxView.Color specificato con x:Arguments

Chiamata dei metodi factory

I metodi factory possono essere chiamati in XAML specificando il nome del metodo usando l'attributo x:FactoryMethod e i relativi argomenti usando l'attributo x:Arguments . Un metodo factory è un public static metodo che restituisce oggetti o valori dello stesso tipo della classe o della struttura che definisce i metodi.

La Color struttura definisce diversi metodi factory e l'esempio di codice seguente illustra la chiamata di tre metodi:

<BoxView HeightRequest="150" WidthRequest="150" HorizontalOptions="Center">
  <BoxView.Color>
    <Color x:FactoryMethod="FromRgba">
      <x:Arguments>
        <x:Int32>192</x:Int32>
        <x:Int32>75</x:Int32>
        <x:Int32>150</x:Int32>                        
        <x:Int32>128</x:Int32>
      </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>

Il numero di elementi all'interno del x:Arguments tag e i tipi di questi elementi devono corrispondere agli argomenti del metodo factory chiamato. Il FromRgba metodo factory richiede quattro Int32 parametri, che rappresentano rispettivamente i valori rosso, verde, blu e alfa, compresi tra 0 e 255. Il FromHsla metodo factory richiede quattro Double parametri, che rappresentano rispettivamente la tonalità, la saturazione, la luminosità e i valori alfa, compresi tra 0 e 1. Il FromHex metodo factory richiede un String oggetto che rappresenta il colore RGB (A)esadecimale.

Gli screenshot seguenti mostrano il risultato della chiamata di ogni Color metodo factory con i valori dell'argomento specificati:

BoxView.Color specificato con x:FactoryMethod e x:Arguments

Specifica di un argomento di tipo generico

È possibile specificare argomenti di tipo generico per il costruttore di un tipo generico usando l'attributo x:TypeArguments , come illustrato nell'esempio di codice seguente:

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

La OnPlatform classe è una classe generica e deve essere creata un'istanza con un x:TypeArguments attributo che corrisponde al tipo di destinazione. On Nella classe l'attributo Platform può accettare un singolo string valore o più valori delimitati da string virgole. In questo esempio la StackLayout.Margin proprietà è impostata su un oggetto specifico Thicknessdella piattaforma.

Per altre informazioni sugli argomenti di tipo generico, vedi Generics in Xamarin.Forms XAML.