無論我將Background屬性更改爲按鈕,它幾乎不會改變,如果我想要一個完全不同的彩色按鈕,我應該怎麼做?如何更改按鈕的背景顏色
我知道我可以通過編輯一個按鈕的模板來做到這一點,但這似乎是矯枉過正。
無論我將Background屬性更改爲按鈕,它幾乎不會改變,如果我想要一個完全不同的彩色按鈕,我應該怎麼做?如何更改按鈕的背景顏色
我知道我可以通過編輯一個按鈕的模板來做到這一點,但這似乎是矯枉過正。
我不太清楚你的意思是「按鈕幾乎不變」,但是當我寫<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
這看起來像是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;
}
}
}
ViNull,您的解決方案非常完美!現在我可以改變按鈕的背景顏色。我現在面臨的唯一問題是,顏色不會改變,直到鼠標從按鈕上移除。即使鼠標懸停在按鈕上,我也想改變顏色。你能爲此提供解決方法嗎? 在此先感謝。 – 2010-05-10 10:23:53
我有同樣的問題。但我做了解決方法。我不是更改按鈕背景顏色,而是將按鈕的邊框寬度設置爲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
你必須接受這三個當中的答案,你在這裏,以便其他使用戶可以從您的經驗,因爲我沒有受益,儘管我不得不讀通過所有的答案,因爲沒有人被標記。無論如何感謝您的問題,這只是幫助我爲我的項目找出解決方案。 =) – 2011-09-29 21:26:25