2010-03-24 12 views
10

Estoy tratando de replicar el efecto "reflejo" tan de moda en la actualidad en una plantilla de control para botones que estoy creando.RectangleGeometry con dimensiones relativas ... ¿cómo?

La idea básica es crear un rectángulo con un relleno de degradado de blanco a transparente y luego recortar un poco de ese rectángulo semitransparente con una recirugía electrometría.

El problema es que no sé cómo definir una geometría relativa de rectángulo. Trabajé alrededor del ancho definiendo un valor grande (1000), pero la altura es un problema. Por ejemplo, funciona bien para botones que tienen una altura de 200, pero no hace nada para botones más pequeños.

¿Alguna idea?

  <Rectangle RadiusX="5" RadiusY="5" StrokeThickness="1" Stroke="Transparent"> 
       <Rectangle.Fill> 
        <LinearGradientBrush StartPoint="0,0" EndPoint="0,0.55"> 
         <GradientStop Color="#66ffffff" Offset="0.0" /> 
         <GradientStop Color="Transparent" Offset="1.0" /> 
        </LinearGradientBrush> 
       </Rectangle.Fill> 
       <Rectangle.Clip> 
        <RectangleGeometry Rect="0,0,1000,60" /> 
       </Rectangle.Clip> 
      </Rectangle> 

Respuesta

11

Se puede hacer esto con un MultiBinding y un nuevo IMultiValueConverter:

public class RectangleConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
{ 
     // you can pass in the value to divide by if you want 
     return new Rect(0, 0, (double)values[0], (double)values[1]/3.33); 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) 
    { 
     throw new NotSupportedException(); 
    } 
} 

y se utiliza como tal en el XAML:

<lcl:RectangleConverter x:Key="rectConverter" /> 

... 

<RectangleGeometry> 
    <RectangleGeometry.Rect> 
     <MultiBinding Converter="{StaticResource rectConverter}"> 
      <Binding Path="ActualWidth" RelativeSource="{RelativeSource AncestorType={x:Type Button}}" /> 
      <Binding Path="ActualHeight" RelativeSource="{RelativeSource AncestorType={x:Type Button}}" /> 
     </MultiBinding> 
    </RectangleGeometry.Rect> 
</RectangleGeometry> 
+0

Me dice: 'El nombre "MultiBinding" no existe en el espacio de nombres "http://schemas.microsoft.com/client/2007". ' –

+0

No sé para qué es ese espacio de nombres xaml, pero el suyo debe ser 'http: // schemas.microsoft.com/winfx/2006/xaml/presentation'. –

+0

Tengo: 'xmlns =" ​​http://schemas.microsoft.com/winfx/2006/xaml/presentation "' y 'xmlns: x =" http://schemas.microsoft.com/winfx/2006/xaml "'. No hay una sola vez que haya "2007" en mi solución. Es una aplicación de Windows Phone 8. –