Производительность анимации WPF со временем снижается - PullRequest
1 голос
/ 12 октября 2011

У меня есть две анимации:

    <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();
    }

После нескольких переключений между пользователем и содержимым музыки анимация ChangeLayout начинается очень медленно и медленно.и анимированный в соответствии с анимацией WPF Performance Suite FPS после переключения падает с 500 + до максимум 4eh ... Не могу найти никакого решения для этого = (

Извините за мой английский, я учусь до сих пор.

1 Ответ

5 голосов
/ 12 октября 2011

Вы добавляете обработчики событий при каждом нажатии кнопки, а не удаляете их.

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

в обоих обработчиках кнопок. Это приведет к потере ресурсов и означает, что вы вызываете код несколько раз при каждом нажатии кнопки.

Решение состоит в том, чтобы либо переместить обработчик, настроенный , за пределы , когда кнопка нажимает, либо удалить обработчик, когда вы это сделали. В последнем случае вам придется переместить код обработчика событий в отдельный метод, чтобы вы могли сделать это:

hl.Completed += MyEventHandler;

Тогда:

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

    hl.Completed -= MyEventHandler;
}

Хотя это означает, что hl должен быть видимым для обоих методов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...