2009-01-14 18 views
3

Peu importe ce que je modifie la propriété d'arrière-plan dans un bouton, il ne change guère, que dois-je faire si je veux un bouton de couleur complètement différente?Comment changer la couleur d'arrière-plan du bouton

Je sais que je peux le faire en éditant un modèle de bouton, mais cela semble être trop.

+0

Vous accepteras une réponse parmi les trois que vous avez ici pour que les autres afin que les utilisateurs puissent profiter de la votre expérience comme je l'ai fait, bien que je devais lire à travers toutes les réponses, car personne n'a été marqué. Merci pour votre question de toute façon, cela m'a juste aidé à trouver une solution pour mon projet. =) –

Répondre

2

Je ne suis pas tout à fait sûr de ce que vous entendez par "bouton ne change guère" mais quand j'écris <Button x:Name="button" Background="Gold" Foreground="Red" Content="Hello!" /> je reçois un bouton d'or avec du texte rouge. Si vous voulez éditer le bouton encore plus (changer à quoi il ressemble quand vous cliquez dessus, etc.), vous devez toujours utiliser des modèles et un gestionnaire d'état visuel. J'ai trouvé deux très bons tutoriels qui se concentrent spécifiquement sur les aspects visuels d'un bouton Silverlight: http://mattberseth.com/blog/2008/03/creating_a_custom_skin_for_sil.html et http://weblogs.asp.net/dwahlin/archive/2008/11/23/using-the-visual-state-manager-in-silverlight-templates.aspx

3

Cela ressemble à un problème avec SilverLight 2.0 et ContentTemplate par défaut pour un bouton. Je pris un coup d'oeil à la source:

<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> 

La question est le rectangle avec son propre arrière-plan est au-dessus de la grille qui a l'arrière-plan que vous avez défini. (En outre, la frontière est codée en dur à blanc). Nous pouvons résoudre ce problème en utilisant notre propre ContentTemplate, mais cela signifie également ajouter tous les éléments de VisualStatManager pour obtenir toutes les animations qui vont avec le bouton.

Une deuxième méthode consiste à sous-classer Button et à modifier le modèle dans le remplacement OnApplyTemplate. Voici un exemple qui réduit l'opacité du bouton Stock afin que l'arrière-plan montre à travers:

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; 
     } 
    } 
} 
+0

ViNull, votre solution a fonctionné parfaitement! Maintenant, je suis capable de changer la couleur backgroud du bouton. Le seul problème auquel je fais face maintenant est la couleur ne change pas jusqu'à ce que la souris soit retirée du bouton. Je veux changer la couleur même lorsque la souris passe au-dessus du bouton. Pourriez-vous fournir une solution de contournement pour cela? Merci d'avance. –

+0

Vous devrez remplacer les états de la souris de VisualStateManager - si vous avez besoin de plus de modifications personnalisées que de modifier l'arrière-plan, il vaut la peine d'aller de l'avant et de fournir votre propre ControlTemplate – ViNull

1

J'ai eu le même problème. Mais j'ai fait une solution de contournement. Au lieu de changer la couleur d'arrière-plan du bouton, je définis la largeur de la bordure du bouton sur 100, puis définissez la couleur de la bordure, par exemple gris.

Vous aurez donc le bouton gris. Je sais que ce n'est pas un bon moyen, mais cela a fonctionné pour moi. Hope it helps

est exemple de code ici:

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 
Questions connexes