c'eravamo lasciati con un poco attraente quadrato ruotante.
Fare meglio era più facile.
Riprendendo in mano l';esempio della scorsa settimana, ho deciso per adesso di accantonare ( solo per oggi ), Timeline e Trigger, per dedicarmi un attimo al "look".
Creiamo un Canvans, utile per posizionare gli elementi relativamente alla sua area.
All'interno aggiungiamo un elisse, che andrà a creare l'illusione di un ombra, sotto l'ex rettangolo rosso.
<!--ombra--> <Ellipse RadiusX="150" RadiusY="30" Canvas.Top="350" Canvas.Left="-5"> <Ellipse.OpacityMask> <RadialGradientBrush GradientOrigin="0.5,0.5" Center="0,0" RadiusX="4" RadiusY="4"> <RadialGradientBrush.GradientStops> <GradientStop Color="Black" Offset="0" /> <GradientStop Color="transparent" Offset="0.10" /> <GradientStop Color="transparent" Offset="0.12"/> </RadialGradientBrush.GradientStops> </RadialGradientBrush> </Ellipse.OpacityMask> <Ellipse.Fill> <SolidColorBrush Color="Black" /> </Ellipse.Fill> <Ellipse.RenderTransform> <TransformGroup> <SkewTransform Center="0,0" AngleY="-20" AngleX="0" /> </TransformGroup> </Ellipse.RenderTransform> </Ellipse>
Sopra la finata ombra il nostro rettangolo rosso cambia così:
<!--scatola--> <Rectangle Width="280" Height="360" Name="myAnimatedRectangle" StrokeThickness="2" Canvas.Left="35"> <Rectangle.Fill> <ImageBrush ImageSource="immagini\doom.jpg" /> </Rectangle.Fill> <Rectangle.Stroke> <SolidColorBrush Color="White" /> </Rectangle.Stroke> <Rectangle.RenderTransform> <TransformGroup> <SkewTransform Center="0,0" AngleY="-15" AngleX="0" /> <ScaleTransform Center="0,0" ScaleX="0.7" ScaleY="1" /> </TransformGroup> </Rectangle.RenderTransform> </Rectangle>
Fin qua nulla che già non si potesse fare, con qualsiasi altro sistema ( SVG, Flash ecc ecc) , posizioniamo un ulteriore rettangolo, all';incirca subito dopo il "myAnimatedRectangle" .
In questa forma, simuleremo la riflessione, attraverso un VisualBrush
<!--riflesso--> <Rectangle Width="400" Height="400" Name="Riflessione" Canvas.Top="450" RenderTransform="scale -1 -1 translate 490 320"> <Rectangle.Fill> <VisualBrush ViewboxUnits="Absolute" Viewbox="0,0,400,480" ViewportUnits="RelativeToBoundingBox" Viewport="0,0,1,1"/> </Rectangle.Fill> <Rectangle.OpacityMask> <LinearGradientBrush StartPoint="0,0" EndPoint="0,1"> <LinearGradientBrush.Transform> <SkewTransform Center="0,0" AngleY="-15" AngleX="0" /> </LinearGradientBrush.Transform> <LinearGradientBrush.GradientStops> <GradientStop Color="transparent" Offset="0.25" /> <GradientStop Color="Black" Offset="0.55" /> <GradientStop Color="transparent" Offset="1"/> </LinearGradientBrush.GradientStops> </LinearGradientBrush > </Rectangle.OpacityMask> </Rectangle>
per finire è necessario aggiunge due righe di C# nel costruttore della finestra:
VisualBrush vs = (VisualBrush)this.Riflessione.Fill;
vs.Visual = this.itemCanvas;
i VisualBrush in 3 parole: sono una figata :), dentro può andare qualsiasi cosa erediti da Visual, in pratica ogni elemento del Framework.
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
- .NET Framework 4.0 beta 1: WPF 4.0, il 18 maggio 2009 alle 15:40
- CTP che va SDk che trovi, il 20 luglio 2006 alle 12:15
- bye bye ScreenSpaceLines3D, il 23 giugno 2006 alle 15:04
- WinFX cambiamenti natalizzi, il 21 dicembre 2005 alle 10:56
- Avalon tutto scorre , l'8 novembre 2005 alle 15:24
- Windows Presentation Foundation, il 26 settembre 2005 alle 15:03