Привязка LinearGradientBrush StartPoint в пользовательском элементе управления

В предыдущем вопросе kbmax рассказал мне, как я могу связать пользовательские свойства в моем generic.xaml. Этот ответ был на Задание фона границы с привязкой шаблона

Он работал отлично, пока я не попытался сделать это с помощью LinearGradientBrush StartPoint. Вот пример:

Это, очевидно, работает нормально:

<LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">

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

<LinearGradientBrush StartPoint="{Binding HeaderBorderGradientStartPoint, RelativeSource={RelativeSource TemplatedParent}}" EndPoint="{Binding HeaderBorderGradientEndPoint, RelativeSource={RelativeSource TemplatedParent}}">

Вот код в классе.

    public static readonly DependencyProperty HeaderBorderGradientStartPointProperty =
        DependencyProperty.Register("HeaderBorderGradientStartPoint", typeof(Point), typeof(GalleryExpander), new PropertyMetadata(new Point(0.5,0)));
    public Point HeaderBorderGradientStartPoint {
        get { return (Point)GetValue(HeaderBorderGradientStartPointProperty); }
        set { SetValue(HeaderBorderGradientStartPointProperty, value); }
    }

    public static readonly DependencyProperty HeaderBorderGradientEndPointProperty =
        DependencyProperty.Register("HeaderBorderGradientEndPoint", typeof(Point), typeof(GalleryExpander), new PropertyMetadata(new Point(0.5,1)));
    public Point HeaderBorderGradientEndPoint {
        get { return (Point)GetValue(HeaderBorderGradientEndPointProperty); }
        set { SetValue(HeaderBorderGradientEndPointProperty, value); }
    }


<Border.BorderBrush>
    <LinearGradientBrush StartPoint="{Binding HeaderBorderGradientStartPoint, RelativeSource={RelativeSource TemplatedParent}}" EndPoint="{Binding HeaderBorderGradientEndPoint, RelativeSource={RelativeSource TemplatedParent}}">
        <LinearGradientBrush.GradientStops>
            <GradientStop Offset="0.0" Color="Transparent" />
            <GradientStop Offset="0.25" Color="Transparent" />
            <GradientStop Offset="0.50" Color="Transparent" />
            <GradientStop Offset="0.75" Color="Transparent" />
            <GradientStop Offset="1.0" Color="Transparent" />
        </LinearGradientBrush.GradientStops>
    </LinearGradientBrush>
</Border.BorderBrush>

Спасибо за любое направление...

1 ответ

Хм, я создал небольшой пользовательский элемент управления, чтобы проверить это, и он работает просто отлично. Мой контроль выглядит так:

public class MyGradientControl : Control
{
    public static readonly DependencyProperty StartPointDProperty =
        DependencyProperty.Register("StartPointD", typeof (Point), 
        typeof (MyGradientControl), new PropertyMetadata(new Point(0.5, 0.5)));

    static MyGradientControl()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof (MyGradientControl), 
            new FrameworkPropertyMetadata(typeof (MyGradientControl)));
    }

    public Point StartPointD
    {
        get { return (Point) GetValue(StartPointDProperty); }
        set { SetValue(StartPointDProperty, value); }
    }
}

И имеет следующий стиль (в темах \generic.xaml):

<Style TargetType="{x:Type local:MyGradientControl}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:MyGradientControl}">
                <Border Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}">
                    <Grid VerticalAlignment="Stretch" 
                          HorizontalAlignment="Stretch">
                        <Grid.Background>
                            <LinearGradientBrush 
                                StartPoint="{Binding StartPointD, 
                                             RelativeSource={RelativeSource 
                                                  TemplatedParent}}" 
                                EndPoint="0, 0">
                                <GradientStop Color="Red" Offset="0"/>
                                <GradientStop Color="White" Offset="1"/>
                            </LinearGradientBrush>
                        </Grid.Background>
                    </Grid>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Предоставляете ли вы GradientStops для LinearGradientBrush? У них есть смещения?

Другие вопросы по тегам