我如何设置一个可能的TextBlock的前景属性在一个ContentPresenter在Silverlight



我在我的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>

相关内容

  • 没有找到相关文章

最新更新