我在我的Silverlight项目中有一个按钮的自定义样式,并想设置按钮文本的前景(和其他属性)。但我的想法是在风格中使用ContentPresenter
。这样,我仍然可以在按钮中添加任何我想要的东西。
但如果有文本作为内容,我希望能够设置某些属性,如前景,FontFamily, FontSize等。我还想改变悬停等属性
这是我的风格(简化):
<Style x:Key="ButtonStyle" TargetType="Button">
<!-- There are other properties here, but I left them out for brevity -->
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border x:Name="ButtonBorder"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
Padding="{TemplateBinding Padding}">
<ContentPresenter x:Name="ButtonContent"
Content="{TemplateBinding Content}"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}">
</ContentPresenter>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal"/>
<VisualState x:Name="MouseOver">
<Storyboard>
<!-- I would like to change the Foreground here -->
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
我找到的所有信息,告诉我添加TextBlock.Foreground="..."
到ContentPresenter,即:
<ContentPresenter x:Name="ButtonContent"
Content="{TemplateBinding Content}"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
TextBlock.Foreground="{TemplateBinding Foreground}">
</ContentPresenter>
然而,这对我不起作用。我得到一个错误说,可附加的属性前景是不可用的类型TextBlock。这是因为该解决方案只适用于WPF,然后我如何在Silverlight中设置此属性?
我知道我可以通过<Setter>
标签设置前台,但是我怎么能在鼠标上改变它呢?我想设置ContentPresenter的前景,这样在MouseOver VisualState中,我可以改变它
(抱歉我的英语不好)
你可以在按钮上设置属性,它应该工作:
<Button Style="{StaticResource ButtonStyle}" Content="Test" Foreground="Red" FontFamily="Georgia" FontSize="25"/>
或者你可以为你的文本按钮创建一个样式:
<Style x:Key="ButtonTextStyle" TargetType="Button" BasedOn="{StaticResource ButtonStyle}">
<Setter Property="Foreground" Value="Red"/>
</Style>
并使用:
<Button Style="{StaticResource ButtonTextStyle}" Content="Test"/>
编辑:试着在ContentPresenter的位置上放一个ContentControl——这样你就会有ForegroundProperty和StoryBoard中的VisualState:
<ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetProperty="Foreground" Storyboard.TargetName="ButtonContent">
<DiscreteObjectKeyFrame KeyTime="0" Value="Red"/>
</ObjectAnimationUsingKeyFrames>
看看Button @ http://msdn.microsoft.com/en-us/library/cc278069(v=vs.95).aspx使用的基线控件模板,我建议您使用该控件,然后根据您的要求调整鼠标。因此,为了让你将鼠标移到红色,我会像这样做
<VisualState x:Name="MouseOver">
<Storyboard>
<DoubleAnimation Duration="0" Storyboard.TargetName="BackgroundAnimation" Storyboard.TargetProperty="Opacity" To="1"/>
<ColorAnimation Duration="0" Storyboard.TargetName="BackgroundGradient" Storyboard.TargetProperty="(Rectangle.Fill).(GradientBrush.GradientStops)[1].(GradientStop.Color)" To="Red"/>
<ColorAnimation Duration="0" Storyboard.TargetName="BackgroundGradient" Storyboard.TargetProperty="(Rectangle.Fill).(GradientBrush.GradientStops)[2].(GradientStop.Color)" To="Red"/>
<ColorAnimation Duration="0" Storyboard.TargetName="BackgroundGradient" Storyboard.TargetProperty="(Rectangle.Fill).(GradientBrush.GradientStops)[3].(GradientStop.Color)" To="Red"/>
</Storyboard>
</VisualState>