0

coloranimationのボタンとクリックイベントがあります。coloranimationは、ボタンの背景を1秒で灰色からオレンジ色にアニメーション化し、次にそれを反転させます。クリックイベントでは、たくさんのものをロードします(約4〜5秒かかります)。

私の問題は、ボタンをクリックするとアニメーションが開始されますが、数ミリ秒(クリックイベントが開始)後にすぐに停止し、クリックイベントが終了するとアニメーションも終了することです。最初にアニメーションを終了してから、クリックイベントを実行したいと思います。

たくさんググって、アニメーションが完了したイベントを見つけて、それは機能していますが、プログラムのすべてのボタンに使用できる、これに対する基本的な解決策をどうにかして作成することは可能ですか?

よろしくお願いします!

BR、ゾリ

編集: - - - - - - - - - - - - - - - - - - - - - - -

このようなことをします:

PreviewMouseDown()
{
    AnimateTheButton();
    //Wait for the animation to be finished
}
4

2 に答える 2

2

さて、あなたが美しくて再利用可能な解決策が欲しいなら、私があなたのために書いたものをチェックしてください。このクラスをソリューションに追加するだけです。

public sealed class AnimatedButton : Button
{
    private bool _isAnimationRunning;

    public static readonly DependencyProperty AnimationProperty =
        DependencyProperty.Register("Animation", typeof(Storyboard), typeof(AnimatedButton));

    public Storyboard Animation
    {
        get { return (Storyboard) GetValue(AnimationProperty); }
        set { SetValue(AnimationProperty, value); }
    }

    protected override void OnPreviewMouseDown(System.Windows.Input.MouseButtonEventArgs e)
    {
        _isAnimationRunning = true;
        if (Animation != null)
        {
            var clonedAnimation = Animation.Clone(); // Else we cannot subscribe Completed event
            clonedAnimation.Completed += OnAnimationComplete;
            clonedAnimation.Begin(this);
        }
        base.OnPreviewMouseDown(e);
    }

    protected override void OnClick()
    {
        if (Animation != null && _isAnimationRunning)
        {
            return;
        }
        base.OnClick();
    }

    private void OnAnimationComplete(object sender, EventArgs eventArgs)
    {
        _isAnimationRunning = false;
        OnClick();
    }
}

使用法。アプリケーションリソースに挿入するだけです。

<Application.Resources>
    <Style x:Key="{x:Type controls:AnimatedButton}" TargetType="{x:Type TestWpf:AnimatedButton}">
        <Setter Property="Animation">
            <Setter.Value>
                <Storyboard Duration="0:0:2">
                    <DoubleAnimation From="0.2" To="1" Storyboard.TargetProperty="Opacity">
                    </DoubleAnimation>
                </Storyboard>
            </Setter.Value>
        </Setter>
    </Style>
</Application.Resources>

そして、通常のボタンのように使用できます。

<local:AnimatedButton Click="OnAnimatedButtonClicked">
    Super cool button
</local:AnimatedButton>
于 2012-08-14T15:36:39.977 に答える