RectangleGeometry с относительными размерами ... как? - PullRequest
10 голосов
/ 24 марта 2010

Я пытаюсь повторить столь модный "рефлекторный" эффект на контрольной панели для кнопок, которые я создаю.

Основная идея - создать прямоугольник с градиентной заливкой от белого до прозрачного, а затем обрезать часть этого полупрозрачного прямоугольника с помощью прямоугольной геометрии.

Проблема в том, что я не знаю, как определить относительную геометрию прямоугольника. Я работал с шириной, определяя большое значение (1000), но высота - проблема. Например, он хорошо работает для кнопок, которые имеют высоту 200, но ничего не делает для кнопок меньшего размера.

Есть идеи?

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

1 Ответ

11 голосов
/ 24 марта 2010

Вы можете сделать это с MultiBinding и новым 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();
    }
}

И используется так же в вашем 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>
...