Стиль кнопки в WPF

325
19 января 2018, 21:30

Есть кнопка. На ней сверху лежит StackPanel с картинкой и надписью. Нужно изменить фон этой панели в зависимости от значений свойств IsEnabled и IsMouseOver. Стандартный триггер стиля кнопки позволяет менять только фон кнопки, а надо по срабатыванию триггера менять фон StackPanel. Как из триггера в стиле добраться до StackPanel и изменить ее свойства?

Answer 1

Вот вам простой пример, но, тут используется VisualStateManager, для смены, цвета, и всего необходимого.

<Style x:Key="BtnFocusVisual">
    <Setter Property="Control.Template">
        <Setter.Value>
            <ControlTemplate>
                <Rectangle
                    Margin="2"
                    SnapsToDevicePixels="true"
                    Stroke="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"
                    StrokeDashArray="1 2"
                    StrokeThickness="1" />
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
<Style x:Key="DefaultBtn" TargetType="{x:Type Button}">
    <Setter Property="OverridesDefaultStyle" Value="True" />
    <Setter Property="FocusVisualStyle" Value="{DynamicResource BtnFocusVisual}" />
    <Setter Property="Padding" Value="12,11,12,10" />
    <Setter Property="MinWidth" Value="100" />
    <Setter Property="SnapsToDevicePixels" Value="True" />
    <Setter Property="VerticalContentAlignment" Value="Center" />
    <Setter Property="HorizontalContentAlignment" Value="Center" />
    <Setter Property="RenderOptions.ClearTypeHint" Value="Enabled" />
    <Setter Property="RenderOptions.BitmapScalingMode" Value="Fant" />
    <Setter Property="FontSize" Value="12" />
    <Setter Property="FontFamily" Value="Helvetica Arial sans-serif" />
    <Setter Property="FontWeight" Value="Normal" />
    <Setter Property="Background" Value="{DynamicResource Static.Background.Brush}" />
    <Setter Property="Foreground" Value="{DynamicResource Static.Foreground.Brush}" />
    <Setter Property="BorderBrush" Value="{DynamicResource Static.Border.Brush}" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <Border
                    x:Name="Border"
                    Padding="{TemplateBinding Padding}"
                    Background="{TemplateBinding Background}"
                    BorderBrush="{TemplateBinding BorderBrush}"
                    BorderThickness=".9"
                    CornerRadius="2">
                    <ContentPresenter
                        x:Name="PART_Button"
                        HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                        VerticalAlignment="{TemplateBinding VerticalContentAlignment}" />
                    <VisualStateManager.VisualStateGroups>
                        <VisualStateGroup Name="Common">
                            <VisualState Name="Normal" />
                            <VisualState Name="MouseOver">
                                <Storyboard>
                                    <ColorAnimation
                                        Storyboard.TargetName="Border"
                                        Storyboard.TargetProperty="(Button.Background).(SolidColorBrush.Color)"
                                        To="{DynamicResource MouseOver.Background.Color}" />
                                    <ColorAnimation
                                        Storyboard.TargetName="Border"
                                        Storyboard.TargetProperty="(Button.BorderBrush).(SolidColorBrush.Color)"
                                        To="{DynamicResource MouseOver.Border.Color}" />
                                </Storyboard>
                            </VisualState>
                            <VisualState Name="Pressed">
                                <Storyboard>
                                    <ColorAnimation
                                        Storyboard.TargetName="Border"
                                        Storyboard.TargetProperty="(Button.Background).(SolidColorBrush.Color)"
                                        To="{DynamicResource Pressed.Background.Color}" />
                                    <ColorAnimation
                                        Storyboard.TargetName="Border"
                                        Storyboard.TargetProperty="(Button.BorderBrush).(SolidColorBrush.Color)"
                                        To="{DynamicResource Pressed.Border.Color}" />
                                </Storyboard>
                            </VisualState>
                            <VisualStateGroup.Transitions>
                                <VisualTransition GeneratedDuration="00:00:00.2" To="Normal" />
                                <VisualTransition GeneratedDuration="00:00:00.2" To="MouseOver">
                                    <VisualTransition.GeneratedEasingFunction>
                                        <ExponentialEase EasingMode="EaseOut" Exponent="10" />
                                    </VisualTransition.GeneratedEasingFunction>
                                </VisualTransition>
                                <VisualTransition GeneratedDuration="00:00:00.2" To="Pressed">
                                    <VisualTransition.GeneratedEasingFunction>
                                        <ExponentialEase EasingMode="EaseOut" Exponent="10" />
                                    </VisualTransition.GeneratedEasingFunction>
                                </VisualTransition>
                                <VisualTransition GeneratedDuration="00:00:00.2" To="Focused">
                                    <VisualTransition.GeneratedEasingFunction>
                                        <ExponentialEase EasingMode="EaseOut" Exponent="10" />
                                    </VisualTransition.GeneratedEasingFunction>
                                </VisualTransition>
                            </VisualStateGroup.Transitions>
                        </VisualStateGroup>
                    </VisualStateManager.VisualStateGroups>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Style.Triggers>
        <Trigger Property="IsEnabled" Value="False">
            <Setter Property="Opacity" Value=".6" />
        </Trigger>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="Cursor" Value="Hand" />
        </Trigger>
    </Style.Triggers>
</Style>

READ ALSO
Проблемы с EntityFramework + SQLite

Проблемы с EntityFramework + SQLite

Пытаюсь подружить EF6 и SQLite базу данныхСоздал модель и контекст данных

210
Есть ли аналог prompt для Node.JS в консоли?

Есть ли аналог prompt для Node.JS в консоли?

Можно ли получать ответы от пользователя в консоли, когда запускаешь Node сервер? Например, как аналог prompt() из JS, когда тебе предлагают ввести...

464
Java script, откуда запущен скрипт

Java script, откуда запущен скрипт

Использую для своих проектов Nodejs + nw

296