如何在Silverlight中的ContentPresenter中设置可能的TextBlock的Foreground属性?

时间:2011-12-03 14:20:53

标签: silverlight styles contentpresenter

我的Silverlight项目中有Buttons的自定义样式,并且想要在按钮中设置文本的Foreground(和其他属性)。但我的想法是在风格中使用ContentPresenter。这样,我仍然可以把任何我想要的东西放在按钮中。

但如果有文本作为内容,我希望能够设置某些属性,如Foreground,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>

但是,这对我不起作用。我收到一个错误,说可附加属性Foreground不适用于TextBlock类型。这是因为该解决方案仅适用于WPF,我如何在Silverlight中设置此属性?

我知道我可以通过<Setter>标签设置前景,但是如何在鼠标悬停时更改它?我想设置ContentPresenter的前景,以便在MouseOver VisualState中,我可以更改它。

2 个答案:

答案 0 :(得分:1)

(抱歉我的英语不好)

你可以在Button上设置属性,它应该可以工作:

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

修改

尝试将ContentControl放在ContentPresenter的位置 - 所以你将在StoryB中拥有ForegroundProperty和VisualState:

<ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetProperty="Foreground" Storyboard.TargetName="ButtonContent">
    <DiscreteObjectKeyFrame KeyTime="0" Value="Red"/>
</ObjectAnimationUsingKeyFrames>

答案 1 :(得分:0)

看一下用于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>