如何更改按钮的背景颜色

时间:2009-01-14 12:07:33

标签: silverlight

无论我将Background属性更改为按钮,它几乎不会改变,如果我想要一个完全不同的彩色按钮,我该怎么办?

我知道我可以通过编辑按钮模板来做到这一点,但这看起来有些过分。

3 个答案:

答案 0 :(得分:3)

这看起来像SilverLight 2.0的问题和Button的默认ContentTemplate。我看了一眼来源:

<ControlTemplate TargetType="controls:Button"> 
<Grid>
    <!-- snipped the 36 lines of VisualStatManager here -->
    <Border x:Name="Background" CornerRadius="3" Background="White" BorderThickness="{TemplateBinding BorderThickness}" BorderBrush="{TemplateBinding BorderBrush}">
        <Grid Background="{TemplateBinding Background}"  Margin="1"> 
            <Border Opacity="0"  x:Name="BackgroundAnimation" Background="#FF448DCA" />
            <Rectangle x:Name="BackgroundGradient" >
                <Rectangle.Fill> 
                    <LinearGradientBrush StartPoint=".7,0" EndPoint=".7,1">
                        <GradientStop Color="#FFFFFFFF" Offset="0" />
                        <GradientStop Color="#F9FFFFFF" Offset="0.375" /> 
                        <GradientStop Color="#E5FFFFFF" Offset="0.625" /> 
                        <GradientStop Color="#C6FFFFFF" Offset="1" />
                    </LinearGradientBrush> 
                </Rectangle.Fill>
            </Rectangle>
        </Grid> 
    </Border>
    <ContentPresenter
            x:Name="contentPresenter" 
            Content="{TemplateBinding Content}" 
            ContentTemplate="{TemplateBinding ContentTemplate}"
            VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 
            HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
            Margin="{TemplateBinding Padding}"/>
    <Rectangle x:Name="DisabledVisualElement" RadiusX="3" RadiusY="3" Fill="#FFFFFFFF" Opacity="0" IsHitTestVisible="false" /> 
    <Rectangle x:Name="FocusVisualElement" RadiusX="2" RadiusY="2" Margin="1" Stroke="#FF6DBDD1" StrokeThickness="1" Opacity="0" IsHitTestVisible="false" />
</Grid>

问题是矩形,它自己的背景位于Grid的顶部,它具有你设置的背景。 (此外,边框硬编码为白色)。我们可以使用我们自己的ContentTemplate解决这个问题,但这意味着还要添加所有VisualStatManager内容以获取与Button一起使用的所有动画。

第二种方法是将Button子类化,并在OnApplyTemplate覆盖中修改模板。下面是一个降低股票Button不透明度的示例,以便背景显示:

public class BKButton : Button {

public override void OnApplyTemplate() {
    base.OnApplyTemplate();

    Border border = GetTemplateChild("Background") as Border;
    Rectangle rect = GetTemplateChild("BackgroundGradient") as Rectangle;

    if(border != null) {
        border.Background = this.Background;
        border.Opacity = .6;
    }
    if (rect != null) {
        LinearGradientBrush lbrush = rect.Fill as LinearGradientBrush;
        if (lbrush != null) {
            lbrush.Opacity = .6;
        }
    }
}

答案 1 :(得分:2)

我不太清楚“按钮几乎没有变化”是什么意思,但是当我写<Button x:Name="button" Background="Gold" Foreground="Red" Content="Hello!" />时,我得到一个带有红色文字的金色按钮。如果您想要更多地编辑按钮(更改它在单击时的外观等),那么您仍然需要使用模板和可视状态管理器。我找到了两个非常好的教程,专门关注Silverlight按钮的视觉方面:http://mattberseth.com/blog/2008/03/creating_a_custom_skin_for_sil.htmlhttp://weblogs.asp.net/dwahlin/archive/2008/11/23/using-the-visual-state-manager-in-silverlight-templates.aspx

答案 2 :(得分:1)

我遇到了同样的问题。但我做了解决方法。我没有更改按钮背景颜色,而是将按钮的边框宽度设置为100,然后设置边框的颜色,例如灰色。

所以你会有灰色按钮。我知道这不是好方法,但它对我有用。 希望它有所帮助

以下是代码示例:

    Dim btn As New Button
    btn.Width = 75
    btn.Height = 35
    btn.BorderThickness = New Thickness(0, 0, 0, 100)
    btn.BorderBrush = New SolidColorBrush(Colors.LightGray)
    AddHandler btn.Click, AddressOf btn_Click
    AddHandler btn.MouseEnter, AddressOf btn_MouseEnter
    AddHandler btn.MouseLeave, AddressOf btn_MouseLeave

    LayoutRoot.Children.Add(btn)


Private Sub btn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
    MessageBox.Show("pressed")
End Sub
Private Sub btn_MouseEnter(ByVal sender As System.Object, ByVal e As System.EventArgs)
    DirectCast(sender, Button).BorderBrush = New SolidColorBrush(Colors.Gray)
End Sub
Private Sub btn_MouseLeave(ByVal sender As System.Object, ByVal e As System.EventArgs)
    DirectCast(sender, Button).BorderBrush = New SolidColorBrush(Colors.LightGray)
End Sub