WPF Использование элемента Tag для привязки цвета

1

Я хочу создать слайдер с градиентом от черного до определенного цвета в качестве фона. Цвет должен быть установлен дополнительно к стилю слайдера. AFAIK, никакие дополнительные свойства не могут быть добавлены к определенному элементу управления, используя только контрольные шаблоны (т.е. Не прикрепленные свойства и не производные элементы управления).

Поэтому я хочу использовать свойство Tag и создал этот фрагмент:

<Style x:Key="ColorSlider" TargetType="{x:Type Slider}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Slider}">
                <Grid>
                    <Rectangle Grid.Column="1" Grid.Row="1">
                            <Rectangle.Fill>
                                <LinearGradientBrush StartPoint="0,0" EndPoint="0,1" >
                                    <GradientStop Color="{TemplateBinding Tag}" Offset="0.0"/>
                                    <GradientStop Color="Black" Offset="1.0"/>
                                </LinearGradientBrush>
                            </Rectangle.Fill>
                        </Rectangle>

                        ....
                    </Grid>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

и используйте его так:

<Slider Style="{StaticResource ColorSlider}" Width="100" Height="500" Tag="{StaticResource redColor}"/>

с redColor beeing статический ресурс (хотя я бы предпочел печатать цвета напрямую с использованием HEX-кодов или предопределенных цветов).

Это, однако, не работает, любая идея почему?

Теги:
templates
xaml
wpf

1 ответ

3
Лучший ответ

Вместо использования TemplateBinding которое разрешается во время компиляции, используйте RelativeSource с режимом, установленным на TemplatedParent который будет разрешен во время выполнения.

TemplateBinding разрешается во время компиляции, но фактическое значение тега будет разрешено во время выполнения, когда применяется staticResource. Вот почему вы должны использовать другой подход.

<GradientStop Color="{Binding Tag, RelativeSource={RelativeSource
                                       Mode=TemplatedParent}}" Offset="0.0"/>
  • 0
    Спасибо, это отлично работает. Однако не могли бы вы объяснить, почему важно, чтобы привязка в этом случае разрешалась во время выполнения, а не во время компиляции?
  • 1
    Добавил больше деталей в ответ.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню