Animação C # WPF da caixa de seleção piscando

Sep 02 2020

Quando eu clico em minha caixa de seleção, uma caixa de mensagem é exibida com um aviso simples de que podem ocorrer travamentos ao alterar a caixa de seleção para verdadeiro. Devo pressionar sim e a caixa de seleção será marcada e a animação de seleção será iniciada.

Mas, como você pode ver no vídeo, a animação também começa quando eu clico na caixa de seleção e o controle deslizante volta imediatamente:

Quero iniciar a animação quando a caixa de seleção for finalmente marcada e evitar essa cintilação. Como posso conseguir isso?

Meu evento de clique na caixa de seleção :

private void CheckBox_Click(object sender, RoutedEventArgs e)
    {
    
    var checkbox = sender as CheckBox;

    var messageBoxResult = MyMessageBoy.Show("Crashes can occur when changing the checkbox to true")

    // if yes checkbox should be checked
    if (messageBoxResult == BoxResult.Yes)
    {
       checkbox.IsChecked = true;
    }
}

Este é o meu modelo de controle e storyboard :

<ControlTemplate TargetType="{x:Type CheckBox}">
                <ControlTemplate.Resources>
                    <Storyboard x:Key="CheckedTrue">
                        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)" Storyboard.TargetName="slider">
                            <EasingDoubleKeyFrame KeyTime="0" Value="-0.25" />
                            <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="33.875" />
                        </DoubleAnimationUsingKeyFrames>
                    </Storyboard>
                    <Storyboard x:Key="CheckedFalse">
                        <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="slider" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)">
                            <SplineDoubleKeyFrame KeyTime="0" Value="34" />
                            <SplineDoubleKeyFrame KeyTime="0:0:0.2" Value="-0.25" />
                        </DoubleAnimationUsingKeyFrames>
                    </Storyboard>
                </ControlTemplate.Resources>
        <ControlTemplate.Triggers>
                    <Trigger Property="IsChecked" Value="True">
                        <Trigger.ExitActions>
                            <BeginStoryboard Storyboard="{StaticResource CheckedFalse}" x:Name="OnUnchecking_BeginStoryboard" />
                        </Trigger.ExitActions>
                        <Trigger.EnterActions>
                            <BeginStoryboard Storyboard="{StaticResource CheckedTrue}" x:Name="OnChecking_BeginStoryboard" />
                        </Trigger.EnterActions>
                    </Trigger>
                    <Trigger Property="IsChecked" Value="False" />
                </ControlTemplate.Triggers>

Respostas

AndreP Sep 02 2020 at 20:41

Uma opção possível seria mover seu storyboard do modelo de controle para o code-behind e apenas começar sua animação no ramo If que verifica se o BoxResult é sim.

Você pode dar uma olhada neste Start Storyboard do código C # para referência.