Vito Arconzo's Blog

.net, .net, .net & windows presentation foundation

Effetto Reflection con i VisualBrush di WPF

Qualche tempo ho parlato dei ColorBrush di WPF.

Un altro tipo di Brush molto utile sono i VisualBrush che ci permettono di disegnare con WPF utilizzando come riempimento un qualsiasi oggetto visuale (Button, ComboBox, TextBox, Page , etc).

<Rectangle Height="200" Width="250">
  <Rectangle.Fill>
    <VisualBrush>
      <VisualBrush.Visual>
        <ComboBox Height="30" Width="100"/>
      </VisualBrush.Visual>
    </VisualBrush>
  </Rectangle.Fill>
</Rectangle>

Come vedete, quindi, il riempimento del rettangolo è una semplice ComboBox che, però, perde le sue funzionalità.

Un esempio tipico di utilizzo di un VisualBrush è quello di un effetto "Riflesso".

visualbrush

Questo tipo di operazione in WPF è davvero semplice.

<Window x:Class="ReflectionVisualTest.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="ReflectionVisualTest" Height="600" Width="800"
    >
  <Window.Background>
    <LinearGradientBrush StartPoint="0,0.3" EndPoint="1,0">
      <LinearGradientBrush.GradientStops>
        <GradientStop Color="#C4CBD8" Offset="0" />
        <GradientStop Color="#E0E4F0" Offset="0.3" />
        <GradientStop Color="#E6EAF5" Offset="0.5" />
        <GradientStop Color="#CFD7E2" Offset="0.9" />
        <GradientStop Color="#C4CBD8" Offset="1" />
      </LinearGradientBrush.GradientStops>
    </LinearGradientBrush>
  </Window.Background>
  <Grid>
    <StackPanel Margin="10">
      <Border BorderBrush="White" BorderThickness="4" Width="408" Height="308">
        <Image Source="gallo.jpg" Width="400" Height="300" Name="myVisual" />
      </Border>
      <Border Width="408" Height="308" Opacity="0.2" BorderBrush="White" BorderThickness="4">
        <Border.OpacityMask>
          <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
            <LinearGradientBrush.GradientStops>
              <GradientStop Offset="0" Color="Black"/>
              <GradientStop Offset=".6" Color="Transparent"/>
            </LinearGradientBrush.GradientStops>
          </LinearGradientBrush>
        </Border.OpacityMask>
        <Border.Background>
          <VisualBrush Visual="{Binding ElementName=myVisual}">
            <VisualBrush.Transform>
              <ScaleTransform ScaleX="1" ScaleY="-1" CenterX="200" CenterY="150" />
            </VisualBrush.Transform>
          </VisualBrush>
        </Border.Background>
      </Border>
    </StackPanel>
  </Grid>
</Window>

Viene, innanzitutto, creato un oggetto Image e successivamente viene utilizzato questo (con l'utilizzo del binding di wpf) come Brush riflesso e con un OpacityMask per l'effetto trasparenza.

Più facile di cosi....

Technorati Tags:  

Posted: Sep 09 2007, 11:47 AM by VitoA | with no comments
Filed under: