自定义按钮的前景色(ControlPresenter)

时间:2011-03-16 18:08:17

标签: wpf controls controltemplate

我正在尝试在App.xaml中定义一个全局按钮样式,它主要按照我的预期工作。但是,我只是想不通如何让Foreground正常工作。无论我做什么,我都会得到默认TextBlock的样式(将颜色设置为白色)。

    <Style TargetType="{x:Type Button}">
        <Setter Property="Margin" Value="3, 5" />
        <Setter Property="OverridesDefaultStyle" Value="True" />
        <Setter Property="FocusVisualStyle" 
                Value="{StaticResource ButtonFocusVisual}" />
        <Setter Property="Foreground" Value="Red" />
        <Setter Property="Padding" Value="5" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="Button">
                    <Grid x:Name="gridMainButton"
                          RenderTransformOrigin="0.5, 0.5">
                        <Grid.RenderTransform>
                            <ScaleTransform x:Name="scaleTransform" 
                                            CenterX="0.5"
                                            CenterY="0.5" />
                        </Grid.RenderTransform>
                        <VisualStateManager.VisualStateGroups>
                            <VisualStateGroup x:Name="CommonStates" >
                                <VisualState x:Name="Normal" />
                                <VisualState x:Name="MouseOver" />
                                <VisualState x:Name="Pressed">
                                    <Storyboard>
                                        <DoubleAnimation
                                              Storyboard.TargetName="scaleTransform"
                                              Storyboard.TargetProperty="ScaleX"
                                              Duration="0"
                                              To="0.85" />
                                    </Storyboard>
                                </VisualState>
                            </VisualStateGroup>
                        </VisualStateManager.VisualStateGroups>

                        <Ellipse x:Name="ellipse"
                                 HorizontalAlignment="Stretch"
                                 VerticalAlignment="Stretch"
                                 StrokeThickness="2"
                                 Stroke="{StaticResource standardBackground}"
                                 Fill="{StaticResource standardBackground}" />
                        <ContentPresenter HorizontalAlignment="Center"
                                          VerticalAlignment="Center"
                                          Margin="4, 8"/>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

我想我可以将ContentPresenter更改为TextBlock,这对于这个特定的应用程序是可以的,但我正在寻找更通用的解决方案。

谢谢,
WTS

3 个答案:

答案 0 :(得分:8)

就像MarkusHütter所说,问题可能是您定义了TextBlock的隐式样式,当Button Content设置为字符串时,将创建TextBlock你在模板中有ContentPresenter。这个TextBlock将获取隐式样式,这就是你遇到这个问题的原因。

您可以为TextBlock指定DataTemplate,为字符串创建的string隐式样式。将以下内容添加到App.xaml

<Application ...>
    <Application.Resources>
        <DataTemplate xmlns:sys="clr-namespace:System;assembly=mscorlib"
                      DataType="{x:Type sys:String}">
            <TextBlock Text="{Binding}">
                <TextBlock.Resources>
                    <Style TargetType="{x:Type TextBlock}"/>
                </TextBlock.Resources>
            </TextBlock>
        </DataTemplate>
        <!--...-->
    </Application.Resources>
</Application>

答案 1 :(得分:1)

您似乎正在使用自定义样式的文本块(如果您说前景颜色为白色),请调用此 StandardTextBlockStyle

在外部网格内的按钮样式中。包括这个:

<Grid x:Name="gridMainButton">
    <Grid.Resources>
        <Style TargetType="TextBlock" BasedOn="{StaticResource StandardTextBlockStyle}">
            <Setter Property="Foreground" Value="Black"/>
        </Style>
    </Grid.Resources>
    <!-- ...-->
</Grid>

这应该覆盖默认的TextBlock样式。

答案 2 :(得分:0)

我遇到了类似的问题,存在全局TextBlock样式,并且在需要自定义颜色/字体的其他控件中我无法覆盖它。

基于Fredrik HedbladPavlo Glazkov(来自here)的答复,以下解决方案对我有效:

<DataTemplate DataType="{x:Type System:String}">
        <TextBlock Text="{Binding}">
            <TextBlock.Resources>
                <Style TargetType="{x:Type TextBlock}" BasedOn="{StaticResource {x:Type TextBlock}}">
                    <Setter Property="Foreground" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type FrameworkElement}}, Path=(TextElement.Foreground),
                        FallbackValue={StaticResource Colors_ThemeForeground_SCBrush}, TargetNullValue={StaticResource Colors_ThemeForeground_SCBrush}}"/>
                </Style>
            </TextBlock.Resources>
        </TextBlock>
    </DataTemplate>

谢谢, RDV