WPF - шаблон ToggleButton Запуск триггера прекращается после первого вызова - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть пользовательский шаблон для ToggleButton с триггерами, предназначенными для обеспечения четкого визуального различия между состоянием Checked и Unchecked.

Основная концепция:

Триггер 1. Когда Togglebuton снят и MouseOver = false: FontSize должен быть равен 13, FontWeight - Normal.

Trigger 2. Когда Togglebuton не отмечен иMouseOver = true: FontSize должно быть 14, FontWeight - Normal.

Триггер 3. При проверке Togglebuton: FontSize должно быть 15, FontWeight - Bold.

Все работает нормально, но после первогоТриггер последовательности переключателя проверки / снятия переключателя 2 останавливается, и ToggleButton больше не изменяет внешний вид при MouseOver = true.

Вот мой фактический XAML.

<Style TargetType="{x:Type ToggleButton}" x:Key="DefaultToggleButtonStyle">
    <Style.Resources>
        <Style x:Key="ButtonFocusVisual">
            <Setter Property="Control.Template">
                <Setter.Value>
                    <ControlTemplate>
                        <Rectangle Margin="2"
                                   SnapsToDevicePixels="true"
                                   Stroke="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"
                                   StrokeThickness="1"
                                   StrokeDashArray="1 2" />
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Style.Resources>
    <Setter Property="FocusVisualStyle" Value="{StaticResource ButtonFocusVisual}" />
    <Setter Property="Background" Value="{DynamicResource ButtonColor}" />
    <Setter Property="Foreground" Value="{DynamicResource EditAreaColor}" />
    <Setter Property="HorizontalContentAlignment" Value="Center" />
    <Setter Property="VerticalContentAlignment" Value="Center" />
    <Setter Property="Padding" Value="1" />
    <Setter Property="Cursor" Value="Hand" />
    <Setter Property="UseLayoutRounding" Value="True" />
    <Setter Property="FontSize" Value="13" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ToggleButton}">
                <ControlTemplate.Resources>
                    <Style TargetType="Border" x:Key="MainBorderStyle">
                        <Setter Property="SnapsToDevicePixels" Value="True" />
                        <Setter Property="CornerRadius" Value="1" />
                        <Setter Property="UseLayoutRounding" Value="True" />
                    </Style>
                </ControlTemplate.Resources>
                <Grid>
                    <Border Background="Black" Opacity="0.5">
                        <Border.Effect>
                            <BlurEffect Radius="7" />
                        </Border.Effect>
                    </Border>
                    <Border x:Name="upperSurfaceBorder" Background="{TemplateBinding Background}" Style="{StaticResource MainBorderStyle}">
                        <Border x:Name="mouserOverHl" Background="Transparent"
                                Style="{StaticResource MainBorderStyle}"
                                BorderThickness="0.5" BorderBrush="{StaticResource MainNormal}">

                        <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                              Margin="{TemplateBinding Padding}"
                                              RecognizesAccessKey="True"
                                              SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
                                              VerticalAlignment="{TemplateBinding VerticalContentAlignment}" />
                        </Border>
                    </Border>
                    <Border Background="Transparent" Style="{StaticResource MainBorderStyle}" x:Name="disabledOverlay" />
                </Grid>
                <ControlTemplate.Triggers>
                    <!--MouseOver-->
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="IsMouseOver" Value="True"/>
                            <Condition Property="IsChecked" Value="False"/>
                        </MultiTrigger.Conditions>
                        <MultiTrigger.EnterActions>
                            <BeginStoryboard>
                                <Storyboard TargetProperty="FontSize">
                                    <DoubleAnimation To="14" Duration="0:0:.3">
                                        <DoubleAnimation.EasingFunction>
                                            <CubicEase EasingMode="EaseOut" />
                                        </DoubleAnimation.EasingFunction>
                                    </DoubleAnimation>
                                </Storyboard>
                            </BeginStoryboard>
                        </MultiTrigger.EnterActions>
                        <MultiTrigger.ExitActions>
                            <BeginStoryboard>
                                <Storyboard TargetProperty="FontSize">
                                    <DoubleAnimation To="13" Duration="0:0:.3">
                                        <DoubleAnimation.EasingFunction>
                                            <CubicEase EasingMode="EaseOut" />
                                        </DoubleAnimation.EasingFunction>
                                    </DoubleAnimation>
                                </Storyboard>
                            </BeginStoryboard>
                        </MultiTrigger.ExitActions>
                    </MultiTrigger>
                    <!--IsChecked-->
                    <Trigger Property="ToggleButton.IsChecked" Value="true">
                        <Trigger.Setters>
                            <Setter Property="Background" Value="{StaticResource MainVeryDark}"/>
                        </Trigger.Setters>
                        <Trigger.EnterActions>
                            <BeginStoryboard>
                                <Storyboard>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="FontWeight">
                                        <DiscreteObjectKeyFrame KeyTime="0:0:0">
                                            <DiscreteObjectKeyFrame.Value>
                                                <FontWeight>Bold</FontWeight>
                                            </DiscreteObjectKeyFrame.Value>
                                        </DiscreteObjectKeyFrame>
                                    </ObjectAnimationUsingKeyFrames>
                                </Storyboard>
                            </BeginStoryboard>
                            <BeginStoryboard>
                                <Storyboard TargetProperty="(ToggleButton.Background).(SolidColorBrush.Color)">
                                    <ColorAnimation Duration="0:0:0.1" To="#002f67">
                                        <ColorAnimation.EasingFunction>
                                            <CubicEase EasingMode="EaseOut" />
                                        </ColorAnimation.EasingFunction>
                                    </ColorAnimation>
                                </Storyboard>
                            </BeginStoryboard>
                            <BeginStoryboard>
                                <Storyboard TargetProperty="FontSize">
                                    <DoubleAnimation To="15" Duration="0:0:0">
                                        <DoubleAnimation.EasingFunction>
                                            <CubicEase EasingMode="EaseOut" />
                                        </DoubleAnimation.EasingFunction>
                                    </DoubleAnimation>
                                </Storyboard>
                            </BeginStoryboard>
                        </Trigger.EnterActions>
                        <Trigger.ExitActions>
                            <BeginStoryboard>
                                <Storyboard>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="FontWeight">
                                        <DiscreteObjectKeyFrame KeyTime="0:0:0">
                                            <DiscreteObjectKeyFrame.Value>
                                                <FontWeight>Normal</FontWeight>
                                            </DiscreteObjectKeyFrame.Value>
                                        </DiscreteObjectKeyFrame>
                                    </ObjectAnimationUsingKeyFrames>
                                </Storyboard>
                            </BeginStoryboard>
                            <BeginStoryboard>
                                <Storyboard TargetProperty="FontSize">
                                    <DoubleAnimation To="13" Duration="0:0:0">
                                        <DoubleAnimation.EasingFunction>
                                            <CubicEase EasingMode="EaseOut" />
                                        </DoubleAnimation.EasingFunction>
                                    </DoubleAnimation>
                                </Storyboard>
                            </BeginStoryboard>
                        </Trigger.ExitActions>
                    </Trigger>
                    <!--Pressed-->
                    <Trigger Property="IsPressed" Value="True">
                        <Trigger.EnterActions>
                            <BeginStoryboard>
                                <Storyboard TargetName="upperSurfaceBorder" TargetProperty="Margin">
                                    <ThicknessAnimation Duration="0:0:0.1" To="2 2 -2 -2">
                                        <ThicknessAnimation.EasingFunction>
                                            <CubicEase EasingMode="EaseOut" />
                                        </ThicknessAnimation.EasingFunction>
                                    </ThicknessAnimation>
                                </Storyboard>
                            </BeginStoryboard>
                        </Trigger.EnterActions>
                        <Trigger.ExitActions>
                            <BeginStoryboard>
                                <Storyboard TargetName="upperSurfaceBorder"
                                            TargetProperty="Margin">
                                    <ThicknessAnimation Duration="0:0:0.1"
                                                        To="0 0 0 0">
                                        <ThicknessAnimation.EasingFunction>
                                            <CubicEase EasingMode="EaseOut" />
                                        </ThicknessAnimation.EasingFunction>
                                    </ThicknessAnimation>
                                </Storyboard>
                            </BeginStoryboard>
                        </Trigger.ExitActions>
                    </Trigger>
                    <!--Disabled-->
                    <Trigger Property="IsEnabled" Value="False">
                        <Trigger.EnterActions>
                            <BeginStoryboard>
                                <Storyboard>
                                    <ColorAnimation Duration="0:0:0.3" Storyboard.TargetName="disabledOverlay"
                                                    Storyboard.TargetProperty="Background.Color" To="#55FFFFFF">
                                        <ColorAnimation.EasingFunction>
                                            <CubicEase EasingMode="EaseOut" />
                                        </ColorAnimation.EasingFunction>
                                    </ColorAnimation>
                                    <DoubleAnimation Duration="0:0:0.3" Storyboard.TargetProperty="Foreground.Opacity" To="0.6" />
                                </Storyboard>
                            </BeginStoryboard>
                        </Trigger.EnterActions>
                        <Trigger.ExitActions>
                            <BeginStoryboard>
                                <Storyboard>
                                    <ColorAnimation Duration="0:0:0.3" To="Transparent" Storyboard.TargetName="disabledOverlay" Storyboard.TargetProperty="Background.Color">
                                        <ColorAnimation.EasingFunction>
                                            <CubicEase EasingMode="EaseOut" />
                                        </ColorAnimation.EasingFunction>
                                    </ColorAnimation>
                                    <DoubleAnimation Duration="0:0:0.3" Storyboard.TargetProperty="Foreground.Opacity" To="1" />
                                </Storyboard>
                            </BeginStoryboard>
                        </Trigger.ExitActions>
                        <Setter Property="Visibility" Value="Visible" TargetName="disabledOverlay" />
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Любые предложения, что не так?Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Ну, как и предполагал RezaNoei, проблема была в ExitActions of Trigger 3. Я решил эту проблему, удалив свойство "To" анимации размера шрифта.Это решение было вдохновлено этой темой .

0 голосов
/ 11 сентября 2018

Ваша главная проблема в Триггере 3. Я думаю, что EnterActions и ExitActions не очень хорошо себя чувствуют с IsChecked Property.Я не знаю почему.

Вы должны пойти другим путем, чтобы написать этот триггер.

...