我正在尝试编写一个显示背景渐变的 Button 控件,从自定义属性指定的颜色开始,以硬编码的颜色结束。在我看来,这应该是一个简单的控制模板,但我无法让它工作。
具有Color
依赖属性的子类“按钮”:
public class GradientButton : Button
{
public Color BackgroundColor
{
get { return (Color)GetValue(BackgroundColorProperty); }
set { SetValue(BackgroundColorProperty, value); }
}
public static readonly DependencyProperty BackgroundColorProperty =
DependencyProperty.Register("BackgroundColor", typeof(Color), typeof(GradientButton), new PropertyMetadata((sender, args) => {
System.Diagnostics.Debug.WriteLine("Set bg col");
}));
public string Text
{
get { return (string)GetValue(TextProperty); }
set { SetValue(TextProperty, value); }
}
public static readonly DependencyProperty TextProperty =
DependencyProperty.Register("Text", typeof(string), typeof(GradientButton), null);
public GradientButton()
: base()
{
this.DefaultStyleKey = typeof(GradientButton);
}
}
控制模板,使用BackgroundColor
DP 设置背景渐变:
<Style TargetType="custom:GradientButton">
<Setter Property="HorizontalAlignment" Value="Left" />
<Setter Property="VerticalAlignment" Value="Top" />
<Setter Property="Width" Value="200" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="custom:GradientButton">
<Grid>
<Grid.Background>
<LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
<GradientStop Color="{TemplateBinding BackgroundColor}" Offset="0" />
<GradientStop Color="Gray" Offset="1" />
</LinearGradientBrush>
</Grid.Background>
<TextBlock Text="{TemplateBinding Text}" />
<TextBlock Text="{TemplateBinding BackgroundColor}" HorizontalAlignment="Right" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
如果我使用这样的控件:
<custom:GradientButton Text="Foo" BackgroundColor="#FF0000" />
然后我希望看到一个带有红色到灰色背景渐变的按钮。相反,只有渐变的灰色部分出现:
我错过了什么令人痛苦的显而易见的事情?
编辑强调:
- 我添加了“文本”DP 来证明我的 DP / TemplateBinding 实际上是犹太洁食。
- 请注意,我无法将“BackgroundColor”显示为文本块中的文本——但我已经在调试器中确认它实际上是在控件上设置的。