Sorry,in fact,i use a Rectangle's RippleEffect to Render a water reflection.
<Rectangle x:Name="imgShader" RenderTransformOrigin="1,0.5" Height="256" Width="1024" MouseMove="Rectangle_MouseMove" MouseLeftButtonDown="Rectangle_MouseLeftButtonDown">
<Rectangle.Fill>
<VisualBrush Visual="{Binding ElementName=gdBackground}" />
</Rectangle.Fill>
<Rectangle.RenderTransform>
<ScaleTransform ScaleY="-1" />
</Rectangle.RenderTransform>
<Rectangle.OpacityMask>
<LinearGradientBrush StartPoint="0,0"
EndPoint="0,1">
<GradientStop Offset="0.3"
Color="Transparent" />
<GradientStop Offset="1"
Color="#44000000" />
</LinearGradientBrush>
</Rectangle.OpacityMask>
<Rectangle.Effect>
<ee:RippleEffect x:Name="effectImgShader" Frequency="0" Center="0.5,0.81" Phase="0" Magnitude="0.03"/>
</Rectangle.Effect>
</Rectangle>
and when mousemove on the Rectangle, I change the RippleEffect's Center to make it likes something in the water;
private Point effectCenter = default(Point);
private void Rectangle_MouseMove(object sender, System.Windows.Input.MouseEventArgs e)
{
Point position = e.GetPosition(this.imgShader);
this.effectCenter.X = position.X / this.imgShader.ActualWidth;
this.effectCenter.Y = position.Y / this.imgShader.ActualHeight;
this.effectImgShader.Center = this.effectCenter;
}
but when I move mouse, it doesn't show effect because the Rectangle didn't refresh, so I use a WriteableBitmap in it to make it can use Invalidate() to repaint.
finally, I just want to refresh Rectangle when mouse moves.