WPF: Как связать свойство color градиентной остановки, расположенной в шаблоне controlTemplate в коде vb? - PullRequest
1 голос
/ 05 августа 2009

Мне нужно сделать это, чтобы создать динамическую фоновую кисть для пользовательского элемента управления (наследует ContentControl). Мой пользовательский элемент управления имеет два свойства зависимостей: StartColor и EndColor. В шаблоне элемента управления для пользовательского элемента управления элемент управления оборачивается рамкой, фон которой равен RadialGradientBrush с градиентными остановками. Цвет одной градиентной остановки привязан к StartColor, а другой - к EndColor. У меня есть эта РАБОТА в XAML, но мне нужно преобразовать ее в код VB. Элемент границы шаблона управления в XAML выполняется с помощью следующего кода:

<Style x:Key="{x:Type wpf:MyControl}" 
   TargetType="{x:Type wpf:MyControl}" 
   BasedOn="{StaticResource {x:Type ContentControl}}">
    <Style.Setters>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type wpf:MyControl}">

                      ...

                    <Border HorizontalAlignment="Stretch" 
                            x:Name="background" Width="Auto"
                            Grid.RowSpan="3" 
                            Opacity="0.9" 
                            CornerRadius="{TemplateBinding CornerRadius}">
                                <Border.Background>
                                    <Custom:RadialGradientBrush>
                                        <Custom:GradientStop Color="{Binding Path=EndColor, 
                                                            RelativeSource={RelativeSource TemplatedParent}, 
                                                            Mode=OneWay}" 
                                                            Offset="0.462"/>
                                        <Custom:GradientStop Color="{Binding StartColor, 
                                                            RelativeSource={RelativeSource TemplatedParent}, 
                                                            Mode=OneWay}" 
                                                            Offset="1"/>
                                    </Custom:RadialGradientBrush>
                                </Border.Background>
                            </Border>

                        ...

                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style.Setters>
</Style>

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

...
Dim backgroundBorder As New FrameworkElementFactory(GetType(Border))
        With backgroundBorder
            .Name = "background"
            .SetValue(Grid.RowSpanProperty, 3)
            .SetValue(Grid.OpacityProperty, 0.9)
            .SetBinding(Border.CornerRadiusProperty, New Binding("CornerRadius") With {.RelativeSource = New RelativeSource(RelativeSourceMode.TemplatedParent)})
        End With

        Dim backgroundBrush As New RadialGradientBrush()

        Dim startColorGradientStop As New GradientStop()
        startColorGradientStop.Offset = 1.0
        BindingOperations.SetBinding(startColorGradientStop, GradientStop.ColorProperty, New Binding("StartColor") With {.RelativeSource = New RelativeSource(RelativeSourceMode.TemplatedParent), .Mode = BindingMode.OneWay})
        backgroundBrush.GradientStops.Add(startColorGradientStop)

        Dim endColorGradientStop As New GradientStop()
        endColorGradientStop.Offset = 0.462
        BindingOperations.SetBinding(endColorGradientStop, GradientStop.ColorProperty, New Binding("EndColor") With {.RelativeSource = New RelativeSource(RelativeSourceMode.TemplatedParent), .Mode = BindingMode.OneWay})
        backgroundBrush.GradientStops.Add(endColorGradientStop)

backgroundBorder.SetValue(Border.BackgroundProperty, backgroundBrush)
...



Любые идеи о том, как я могу сделать это в коде VB?

Ответы [ 2 ]

1 голос
/ 06 августа 2009

Знаете ли вы, что подход FrameworkElementFactory больше не рекомендуется, согласно MS? Рекомендуемый подход заключается в создании любого элемента / ресурса в коде с помощью XamlReader.Parse .

0 голосов
/ 05 августа 2009

Вы должны получить доступ к родительскому контент-контролю, для которого граница должна быть контентом. И установите это в своем коде VB.

То, что я здесь имел в виду под ContentControl, это то, какой бы элемент управления не являлся родителем Border, вам нужно получить доступ к нему с помощью функции переопределения OnApplyTemplate и добавить созданную VB.NET рамку как дочернюю для этого визуала.

...