Silverlight offre la possibilità di applicare trasformazioni, come rotazioni e traslazioni, ad ogni elemento dell'interfaccia utente. Grazie ad esse possiamo modificare la dimensione e/o la posizione di un elemento senza cambiare le sue coordinate. La seguente tabella mostra tutte le trasformazioni disponibili.
| Trasformazione | Descrizione |
|---|---|
RotateTransform | Ruota un elemento in base al valore specificato per la proprietà Angle |
ScaleTransform | Ridimensiona un elemento in base ai valori specificati per le proprietà ScaleX e ScaleY |
SkewTransform | Inclina un elemento in base ai valori specificati per le proprietà AngleX e AngleY |
TranslateTransform | Trasla un elemento in base ai valori specificati per le proprietà X e Y | .
TransformGroup | Raggruppa più oggetti Transform in uno |
MatrixTransform | Crea una trasformazione (matriciale) personalizzate in base ai valori specificati per l'oggetto Matrix |
Per applicare una trasformazione basta utilizzare una delle classi che ereditano System.Windows.Media.Transform impostando le relative proprietà, per esempio possiamo utilizzare la classe RotateTransform per ruotare un rettangolo, come dimostrato nel seguente frammento di codice:
<Rectangle Width="100" Height="10" Stroke="Black" Fill="Yellow"
Canvas.Left="100" Canvas.Top="100">
</Rectangle>
<Rectangle Width="100" Height="10" Stroke="Black" Fill="Green"
Canvas.Left="100" Canvas.Top="100">
<Rectangle.RenderTransform>
<RotateTransform Angle="25" />
</Rectangle.RenderTransform>
</Rectangle>
Figura 70. Esempi di rotazione
Tutte le trasformazioni si basano su un punto di origine, che per default è (0,0) ovvero l'angolo in alto a sinistra. Questo valore può essere modificato impostando la proprietà RenderTransformOrigin, la quale accetta un valore decimale che va da (0,0) a (1,1). Nel prossimo esempio applichiamo una serie di rotazioni progressive, utilizzando il centro dell'elemento come punto di origine e come angolo i valori 25, 50, 75 e 100. Parte del codice è stato omesso per brevità.
<Rectangle Width="100" Height="10" Stroke="Black" Fill="Green"
Canvas.Left="100" Canvas.Top="100">
</Rectangle>
<Rectangle Width="100" Height="10" Stroke="Black" Fill="Green"
Canvas.Left="100" Canvas.Top="100"
RenderTransformOrigin="0.5,0.5">
<Rectangle.RenderTransform>
<RotateTransform Angle="25" />
</Rectangle.RenderTransform>
</Rectangle>
<Rectangle ...>
<Rectangle.RenderTransform>
<RotateTransform Angle="50" />
</Rectangle.RenderTransform>
</Rectangle>
...
Figura 71. Rotazione su un punto centrale
Come abbiamo detto, possiamo applicare le trasformazioni ad un controllo dell'interfaccia, come per esempio un Button. Quando utilizziamo un Layout Control che posiziona gli elementi in maniera relativa e sulla base della dimensione degli altri controlli dobbiamo stare attenti, altrimenti rischiamo di ottenere degli effetti indesiderati, come dimostrato nel seguente esempio dove applichiamo una rotazione ad un Button contenuto in uno StackPanel, insieme ad altri Button. Il risultato è che esso andrà a sovrapporsi o sarà sovrapposto dagli altri controlli.
<StackPanel x:Name="LayoutRoot" Background="Azure">
<Button Height="50" Width="100" Content="Cliccami" />
<Button Height="50" Width="100" Content="Cliccami"
RenderTransformOrigin="0.5,0.5">
<Button.RenderTransform>
<RotateTransform Angle="25" />
</Button.RenderTransform>
</Button>
<Button Height="50" Width="100" Content="Cliccami" />
</StackPanel>
Figura 72. Rotazione su un punto centrale
Un altro scenario in cui le trasformazioni vengono utilizzate è quello degli effetti e animazioni, per esempio possiamo creare un effetto "riflesso". Realizzare questo effetto non è difficile, basta posizionare lo stesso elemento grafico per due volte in un Layout Control, per esempio un immagine, e successivamente modificare l'aspetto del secondo elemento in modo da farlo sembrare un riflesso. Per farlo, ci serviamo di una trasformazione che ribalta l'immagine e di una maschera di opacità che la sfuma.
<Grid x:Name="LayoutRoot" Background="White" Margin="10">
<Grid.RowDefinitions> <RowDefinition /> <RowDefinition /> </Grid.RowDefinitions>
<Image Source="img1.jpg" />
<Image Grid.Row="1" Source="img1.jpg"
RenderTransformOrigin="0,0.4">
<Image.RenderTransform>
<ScaleTransform ScaleY="-0.75"></ScaleTransform>
</Image.RenderTransform>
<Image.OpacityMask>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
<GradientStop Offset="0" Color="Transparent"></GradientStop>
<GradientStop Offset="1" Color="#44FFFFFF"></GradientStop>
</LinearGradientBrush>
</Image.OpacityMask>
</Image>
</Grid>
Figura 73. Ottenere un effetto "riflesso"
Il valore decimale negativo applicato alla proprietà ScaleY della trasformazione ScaleTransform ribalta e comprime l'immagine, mentre le coordinate impostate come origine della trasformazione permettono di mantenere la seconda immagine posizionata sotto alla prima anche dopo la trasformazione.
LINQ e la trappola della 'deferred execution'Una "trappola" in cui si può incappare utilizzando il risultato di... |
C#, le Custom Type ConversionConversioni personalizzate tra classi, creare metodi particolari per... |
Introduzione a Entity FrameworkIl framework ORM messo a disposizione da .NET |
Repeater: visualizzare un feed RSSUtilizzare il controllo XMLDataSource e sfruttare il metodo XPath()... |
Repeater, il server control "semplice"Cos'è e come funziona il controllo Repeater |
Guida ASP.NET MVC Best PracticesUn workflow dettagliato e ricco di suggerimenti pratici per... |
Guida ASP.NET Starter KitUn modo semplice per imparare ad utilizzare le tecnologie Microsoft... |
Guida Visual Studio 2010L'ambiente di sviluppo di riferimento per sviluppare applicazioni su... |
Ogni giovedì, direttamente nella tua e-mail: articoli, guide, tutorial e script ASP, ASP.Net, SQL server e IIS.
Iscriviti alla newsletter
|
|
Corso Progettazione database11 Maggio 2012 a Milano |
|
|
Amministratore di Reti Windows Server 200811 Giugno 2012 a Milano |
|
Nessun corso previsto |