2010-03-24 15 views
10

Ich versuche, den heutzutage so modischen "Reflex" -Effekt auf einer Kontrollvorlage für Buttons, die ich erstelle, zu replizieren.RectangleGeometry mit relativen Dimensionen ... wie?

Die Grundidee besteht darin, ein Rechteck mit einer Farbverlaufsfüllung von weiß bis transparent zu erstellen und dann einige dieser halbtransparenten Rechtecke mit einer Rechteckgeometrie abzuschneiden.

Das Problem ist, dass ich nicht weiß, wie man eine relative Rechteckgeometrie definiert. Ich habe irgendwie um die Breite gearbeitet, indem ich einen großen Wert (1000) definiert habe, aber Höhe ist ein Problem. Zum Beispiel funktioniert es gut für Tasten, die eine Höhe von 200 haben, aber nichts für kleinere Tasten tun.

Irgendwelche Ideen?

  <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> 

Antwort

11

Sie können dies tun mit einer MultiBinding und einem neuen 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(); 
    } 
} 

Und wie so in XAML verwendet:

<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

Es sagt mir: ‚Der Name "Multibinding" existiert nicht im Namespace "http://schemas.microsoft.com/client/2007". ' –

+0

Ich weiß nicht, wofür der Xaml-Namespace ist, aber Ihr sollte "http: // schemas.microsoft.com/winfx/2006/xaml/presentation" sein. –

+0

Ich habe: 'xmlns =" ​​http://schemas.microsoft.com/winfx/2006/xaml/presentation "' und 'xmlns: x =" http://schemas.microsoft.com/winfx/2006/xaml "'. Nicht ein einziges Mal gibt es "2007" in meiner Lösung. Es ist eine Windows Phone 8-Anwendung. –