Цвет переднего плана пользовательской кнопки (ControlPresenter) - PullRequest
5 голосов
/ 16 марта 2011

Я пытаюсь определить глобальный стиль кнопок в App.xaml, и он в основном работает, как я ожидал.Однако я просто не могу понять, как заставить передний план работать правильно.Независимо от того, что я делаю, я получаю стиль 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 ]

8 голосов
/ 16 марта 2011

Как сказал Маркус Хюттер, проблема, вероятно, в том, что у вас есть неявный стиль для TextBlock, а когда для Button Content задана строка, будет создан TextBlock, где у вас есть ContentPresenterв шаблоне.Этот TextBlock подберет скрытый стиль, и именно поэтому вы получаете эту проблему.

Вы можете отключить неявный стиль для TextBlock s, который создается на месте для строки, указав 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 голос
/ 16 марта 2011

вы, кажется, используете собственный стиль для текстового блока (если вы говорите, что цвет переднего плана - белый), давайте назовем это StandardTextBlockStyle .

В вашем стиле кнопки во внешней сетке.включите это:

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

это должно переопределить стиль TextBlock по умолчанию.

0 голосов
/ 27 марта 2019

У меня была похожая проблема, был глобальный стиль TextBlock, и я не смог переопределить его в других элементах управления, где требовался собственный цвет / шрифт.

На основе Фредрик Хедблад & Павел Глазков (из здесь ) ответов, у меня сработало следующее решение:

<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

...