OnFocus изменяет цвет переднего плана содержимого кнопки

У меня есть кнопка:

<Button Grid.Column="0" Style="{StaticResource BodyPartLable}" Margin="0, 5, 0, 0" PreviewMouseLeftButtonDown="ButtonNeck_OnPreviewMouseDown" PreviewMouseLeftButtonUp="ButtonNeck_OnPreviewMouseUp">
        <Grid Width="200" Height="100">
            <Grid.RowDefinitions>
                <RowDefinition />
                <RowDefinition />
            </Grid.RowDefinitions>
            <TextBlock Grid.Row="0" TextAlignment="Right" Text="+1" Margin="0,3,5,0" Foreground="White" />
            <TextBlock Grid.Row="1" Foreground="#c0b6d1" FontFamily="Segoe UI Semibold" MouseRightButtonDown="Neck_EditStarted" FontSize="18" Margin="13,-28,0,0">
                            <TextBox Margin="-5,0,0,0" Name="sizeNeck"  Background="#FF61596F" Foreground="Tomato" Height="60" IsEnabled="False" BorderBrush="Transparent" FontSize="40"
                                                             ContextMenu="{x:Null}" ContextMenuService.IsEnabled="false"  MaxLength="6" 
                                                             LostFocus="TextBox_LostFocus" Tag="BackCollarHeightUI" Text="55"></TextBox>
                                <LineBreak/>
                                <TextBlock Name="NecktLb" Text="Neck"/><Span>&#160;(</Span><Span><TextBlock Text="inch"/></Span><Span>)</Span>
                            </TextBlock>
        </Grid>
    </Button>

И стиль:

<Style x:Key="BodyPartLable" TargetType="Button">
        <Setter Property="BorderBrush" Value="#FFFFFFFF"/>
        <Setter Property="BorderThickness" Value="0"/>
        <Setter Property="Padding" Value="12,0,0,0"/>
        <Setter Property="FocusVisualStyle" Value="{x:Null}"/>
        <Setter Property="VerticalAlignment" Value="Center"/>
        <Setter Property="FontFamily" Value="Segoe UI"/>
        <Setter Property="FontWeight" Value="SemiBold"/>
        <Setter Property="FontSize" Value="14"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="Button">
                    <Grid>
                        <VisualStateManager.VisualStateGroups>
                            <VisualStateGroup x:Name="CommonStates">
                                <VisualState x:Name="Normal">
                                </VisualState>
                                <VisualState x:Name="PointerOver">
                                </VisualState>
                                <VisualState x:Name="Pressed">
                                </VisualState>
                                <VisualState x:Name="Disabled">
                                </VisualState>
                            </VisualStateGroup>
                            <VisualStateGroup x:Name="FocusStates">
                                <VisualState x:Name="Focused">
                                    <Storyboard>
                                        <!--<DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="FocusVisualWhite"/>
                                        <DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="FocusVisualBlack"/>-->
                                        <ColorAnimation Duration="0" To="#FF826C83" Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)" Storyboard.TargetName="Border"/>
                                        <ColorAnimation Duration="0" To="White" Storyboard.TargetProperty="(TextBlock.Foreground).(SolidColorBrush.Color)" Storyboard.TargetName="ContentPresenter"/>
                                    </Storyboard>
                                </VisualState>
                                <VisualState x:Name="Unfocused"/>
                                <VisualState x:Name="PointerFocused"/>
                            </VisualStateGroup>
                        </VisualStateManager.VisualStateGroups>
                        <Border x:Name="Border" CornerRadius="3" Padding="0" Background="#FF61596F" Height="120" Width="220">
                            <Border.BorderBrush>
                                <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                                    <GradientStop Color="Black" Offset="0"/>
                                    <GradientStop Color="White" Offset="1"/>
                                </LinearGradientBrush>
                            </Border.BorderBrush>
                            <ContentPresenter x:Name="ContentPresenter" ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" UseLayoutRounding="True" RenderTransformOrigin="0.5,0.5" HorizontalAlignment="Left" Margin="0"/>
                        </Border>
                        <Rectangle x:Name="FocusVisualWhite" IsHitTestVisible="False" Opacity="0" StrokeDashOffset="1.5" StrokeEndLineCap="Square" Stroke="White" StrokeDashArray="1,1"/>
                        <Rectangle x:Name="FocusVisualBlack" IsHitTestVisible="False" Opacity="0" StrokeDashOffset="0.5" StrokeEndLineCap="Square" Stroke="Black" StrokeDashArray="1,1"/>

                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

Для VisualState Focused я должен изменить цвет текста содержимого кнопки на White. '' этот код не работает в моем случае, но это только решения, которые я могу найти на StackOverflow.


Upd: при нажатии кнопки я установил эту кнопку сфокусированной на код программной части


person demo    schedule 17.01.2016    source источник
comment
Вы выбрали Button для своего стиля, но сама кнопка состоит из нескольких частей, каждая из которых устанавливает свой собственный цвет переднего плана.   -  person ChrisF    schedule 17.01.2016
comment
@ChrisF, stackoverflow.com/questions/15244145/ Должна ли установка этого стиля только для текстовых полей помочь?   -  person demo    schedule 17.01.2016


Ответы (1)


Определите стили для текстовых блоков, используя триггеры DataTriggers и Binding Your Property to the Button, и примените это ко всем кнопкам content в этом TextBlock, код ниже...

<Style x:Key="TextBlockStyle" TargetType="{x:Type TextBlock}">
    <Setter Property="Background" Value="Transparent"/>
    <Setter Property="Foreground" Value="White"/>
    <Style.Triggers>
        <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Button,AncestorLevel=1}, Path=IsFocused}" Value="True">
            <Setter Property="Foreground" Value="Red"/>
        </DataTrigger>
    </Style.Triggers>
</Style>
person Javad Ebrahimi    schedule 17.01.2016
comment
Ну да, это должен быть ответ. Только один вопрос: как я могу изменить значение встроенного `Foreground? Если я устанавливаю цвет как встроенный - триггер не работает. - person demo; 17.01.2016
comment
Если я правильно понимаю вопрос, я думаю, что в конце концов вам нужно использовать несколько текстовых блоков в качестве контента, а в вашем стиле используйте MultiDataTrigger, а в условии проверьте два или более примеров: «IsFocused» (для кнопки) и «IsFocused» для ( текстовый блок) или другое...) - person Javad Ebrahimi; 17.01.2016
comment
Нет, я говорю о другом :) Ну, в textBlock я установил Foreground прямо в коде xaml (это я называю встроенным стилем, как в css). Это Foreground я не могу переписать, используя DataTrigger, как вы предложили. Итак, вопрос в том, как я могу переписать это значение, не заменяя его стилем в ресурсах? - person demo; 17.01.2016