1

私は2つのアニメーションを持っています:

    <Storyboard x:Key="ChangeLayout">
        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(Canvas.Left)" Storyboard.TargetName="currentContent">
            <EasingDoubleKeyFrame KeyTime="0:0:0.0" Value="900"/>
            <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="0">
                <EasingDoubleKeyFrame.EasingFunction>
                    <CircleEase EasingMode="EaseInOut"/>
                </EasingDoubleKeyFrame.EasingFunction>
            </EasingDoubleKeyFrame>
        </DoubleAnimationUsingKeyFrames>
    </Storyboard>
    <Storyboard x:Key="HideLayout">
        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(Canvas.Left)" Storyboard.TargetName="currentContent">
            <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="-900">
                <EasingDoubleKeyFrame.EasingFunction>
                    <CircleEase EasingMode="EaseInOut"/>
                </EasingDoubleKeyFrame.EasingFunction>
            </EasingDoubleKeyFrame>
        </DoubleAnimationUsingKeyFrames>
    </Storyboard>

そして、それらを開始するコード:

private void btnUser_Click(object sender, RoutedEventArgs e)
    {
        if (currentContent.Content != null)
            if (currentContent.Content.GetType() == typeof(Layouts.User))
                return;
        ((hl.Children[0] as DoubleAnimationUsingKeyFrames).KeyFrames[0] as EasingDoubleKeyFrame).Value = -this.ActualWidth;
        hl.Completed += (_sender, _e) =>
        {
            currentContent.Content = new Layouts.User();
            cl.Completed += (ssender, ee) =>
                {
                    btnMusic.Opacity = 0.5;
                    btnUser.Opacity = 0.9;
                };
            cl.Begin();
        };
        hl.Begin();
    }
    private void btnMusic_Click(object sender, RoutedEventArgs e)
    {
        if (currentContent.Content != null)
            if (currentContent.Content.GetType() == typeof(Layouts.Music))
                return;
        ((hl.Children[0] as DoubleAnimationUsingKeyFrames).KeyFrames[0] as EasingDoubleKeyFrame).Value = -this.ActualWidth;
        hl.Completed += (_sender, _e) =>
            {
                if (Layouts.Music.CurrentMusic == null)
                {
                    Layouts.Music.CurrentMusic = new Layouts.Music();
                    Layouts.Music.CurrentMusic.GetMusic();
                }
                currentContent.Content = Layouts.Music.CurrentMusic;
                cl.Completed += (ssender, ee) =>
                    {
                        btnUser.Opacity = 0.5;
                        btnMusic.Opacity = 0.8;
                    };

                cl.Begin();
            };
        hl.Begin();
    }

ユーザーと音楽のコンテンツを数回切り替えた後、500 + から最大 4eh にドロップを切り替えた後、WPF Performance Suite FPS アニメーションに従って、ChangeLayout アニメーションが非常に遅くラグが発生し、アニメーション化されます ... これに対する解決策が見つかりません=(

私の英語はごめんなさい、私は今のところ勉強しています。

4

1 に答える 1

5

ボタンがクリックされるたびにイベントハンドラーを追加し、それらを削除していません。

hl.Completed += (_sender, _e) =>
{
};

両方のボタン ハンドラーで。これはリソースを消費し、ボタンをクリックするたびにコードを複数回呼び出すことを意味します。

解決策は、ハンドラーの設定をボタンのクリックのに移動するか、完了したらハンドラーを削除することです。後者の場合、イベント ハンドラー コードを別のメソッドに移動して、これを行う必要があります。

hl.Completed += MyEventHandler;

それで:

private void MyEventHandler(object sender, EventArgs e)
{
    // Do stuff

    hl.Completed -= MyEventHandler;
}

これは、hl両方のメソッドから見える必要があることを意味します。

于 2011-10-12T19:41:57.233 に答える