Ошибка в анимации раскадровки? - PullRequest
2 голосов
/ 04 августа 2011

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

Рассказ об анимации высоты ListBox. Вот следующие скриншоты:

а) «Средний» - это текстовый блок

Image1

b) «Средний» TextBlock заменяется ListBox. Пользователь выбирает предмет. Это инициирует анимацию ListBox.Height. После завершения анимации ListBox заменяется оригинальным TextBlock. (Не обращайте внимания на различия в данных. Сбор изображений был болезненным процессом, когда мне приходилось работать с визуализированными кадрами. Одно из изображений было снято для другой записи.)

Img2 Img3 Img4

Эта последовательность работает с периодическим мерцанием. Я хотел знать, что происходит, и через некоторое время я получил этот скриншот:

Img5

То, что вы видите, это первый кадр после того, как событие Storyboard.Completed было перехвачено. Насколько я понимаю, это окончательный результат раскадровки.

Примечания:

  • В этот момент я проверил визуальное дерево и не нашел ничего подозрительного.

  • Это только один из эффектов, которые происходят. Другим частым случаем является ListBox размером 1 строка с измененной штриховкой; в этом случае все элементы над списком исчезают. 3-я возможность - диагональная красная линия на весь экран.

Вот код, определяющий раскадровку:

    private Storyboard GetDropDownAnimation(double from, double to)
    {
        double secs = this.IsExpanded ? 0.2 : 0.4;
        CubicEase ease = new CubicEase() { EasingMode = EasingMode.EaseInOut };
        DoubleAnimation animation = new DoubleAnimation()
        {
            Duration = new Duration(TimeSpan.FromSeconds(secs)),
            From = from,
            To = to,
            FillBehavior = FillBehavior.HoldEnd,
            EasingFunction = ease
        };
        Debug.WriteLine("Animation Height {0} -> {1}", from, to);

        Storyboard.SetTarget(animation, this);
        Storyboard.SetTargetProperty(animation, new PropertyPath("Height"));

        Storyboard sb = new Storyboard();
        sb.Children.Add(animation);
        return sb;
    }

Я мог бы объяснить другие проделанные трюки (долгое время я был уверен, что проблема есть), но похоже, что проблема касается только самой анимации.

Кто-нибудь может объяснить, что происходит?

Ответы [ 2 ]

2 голосов
/ 04 августа 2011

Взгляните на них, прежде чем продолжить, это может немного облегчить вашу жизнь:)

Тем не менее, посмотрите на начальную стоимость анимации) и посмотрите, правильно ли это.

Если ничего не помогло, вы можете начать с полностью прозрачного списка.

0 голосов
/ 05 августа 2011

Я добился некоторого прогресса в решении проблемы, о которой стоит рассказать.

Сначала я заменил раскадровку собственной анимацией. Я начал с использования обратных вызовов CompositionTarget.Rendering. Код довольно тривиален: при обратном вызове вам необходимо обновить высоту ListBox пропорционально истекшему времени. Я дважды проверил, что для каждого изменения высоты существует одно событие LayoutUpdated, другими словами, экран постоянно синхронизирован. (Приятный сюрприз.)

Результат: мерцание осталось.

Вывод: раскадровка невиновна.

Тогда я нашел кое-что интересное: Поскольку манипуляции с высотой были в моих руках, я просто округлил значение до целого кратного высоты строки. И угадайте, что - мерцание исчезло!

Обратите внимание, что рассматриваемый ListBox настроен с использованием ItemsSource и DisplayMemberPath, который ссылается на строковое свойство. ItemTemplate не установлен. Другими словами довольно стандартное использование ListBox.

Это не ответ, я знаю, но я нахожу это интересным.

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