Я хочу создать слайдер с градиентом от черного до определенного цвета в качестве фона. Цвет должен быть установлен дополнительно к стилю слайдера. 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-кодов или предопределенных цветов).
Это, однако, не работает, любая идея почему?
Вместо использования TemplateBinding
которое разрешается во время компиляции, используйте RelativeSource
с режимом, установленным на TemplatedParent
который будет разрешен во время выполнения.
TemplateBinding разрешается во время компиляции, но фактическое значение тега будет разрешено во время выполнения, когда применяется staticResource. Вот почему вы должны использовать другой подход.
<GradientStop Color="{Binding Tag, RelativeSource={RelativeSource
Mode=TemplatedParent}}" Offset="0.0"/>