无论我将Background属性更改为按钮,它几乎不会改变,如果我想要一个完全不同的彩色按钮,我该怎么办?
我知道我可以通过编辑按钮模板来做到这一点,但这看起来有些过分。
答案 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.html和http://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