2009-01-14 124 views
3

無論我將Background屬性更改爲按鈕,它幾乎不會改變,如果我想要一個完全不同的彩色按鈕,我應該怎麼做?如何更改按鈕的背景顏色

我知道我可以通過編輯一個按鈕的模板來做到這一點,但這似乎是矯枉過正。

+0

你必須接受這三個當中的答案,你在這裏,以便其他使用戶可以從您的經驗,因爲我沒有受益,儘管我不得不讀通過所有的答案,因爲沒有人被標記。無論如何感謝您的問題,這只是幫助我爲我的項目找出解決方案。 =) – 2011-09-29 21:26:25

回答

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

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> 

的問題是與它自己的背景矩形是在具有您所設置的背景網格的頂部。 (此外,邊框被硬編碼爲白色)。我們可以使用我們自己的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; 
     } 
    } 
} 
+0

ViNull,您的解決方案非常完美!現在我可以改變按鈕的背景顏色。我現在面臨的唯一問題是,顏色不會改變,直到鼠標從按鈕上移除。即使鼠標懸停在按鈕上,我也想改變顏色。你能爲此提供解決方法嗎? 在此先感謝。 – 2010-05-10 10:23:53

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