Как изменить цвет фона кнопки - PullRequest
3 голосов
/ 14 января 2009

Независимо от того, что я изменяю свойство Background на кнопку, оно почти не меняется, что мне делать, если я хочу кнопку совершенно другого цвета?

Я знаю, что могу сделать это, отредактировав шаблон кнопки, но это кажется излишним.

Ответы [ 3 ]

3 голосов
/ 09 июня 2009

Это похоже на проблему с SilverLight 2.0 и 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>

Проблема в том, что прямоугольник с собственным фоном находится над сеткой, в которой есть заданный фон. (Кроме того, граница жестко запрограммирована для белых). Мы можем исправить это с помощью нашего собственного ContentTemplate, но это означает также добавление всего материала VisualStatManager для получения всех анимаций, которые идут вместе с Button.

Второй метод заключается в создании подкласса Button и изменении шаблона в переопределении OnApplyTemplate. Вот пример, который снижает непрозрачность стоковой кнопки, чтобы фон просвечивал:

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;
        }
    }
}
2 голосов
/ 14 января 2009

Я не совсем уверен, что вы подразумеваете под "кнопка почти не меняется", но когда я пишу <Button x:Name="button" Background="Gold" Foreground="Red" Content="Hello!" />, я получаю золотую кнопку с красным текстом. Если вы хотите еще больше отредактировать кнопку (изменить ее внешний вид при нажатии на нее и т. Д.), Вам все равно придется использовать шаблоны и визуальный менеджер состояний. Я нашел два довольно хороших урока, которые специально посвящены визуальным аспектам кнопки Silverlight: http://mattberseth.com/blog/2008/03/creating_a_custom_skin_for_sil.html и http://weblogs.asp.net/dwahlin/archive/2008/11/23/using-the-visual-state-manager-in-silverlight-templates.aspx

1 голос
/ 12 мая 2011

У меня была такая же проблема. Но я сделал обходной путь. Вместо изменения цвета фона кнопки я устанавливаю ширину границы кнопки равной 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...