Как анимировать позицию ListBoxItem - PullRequest
2 голосов
/ 14 января 2012

У меня возникли проблемы с анимацией элементов в моем ListBox. Анимации в OpacityProperty работают отлично, но когда я пытаюсь анимировать положение моего ListBoxItem, он просто не сдвигается ни на дюйм (не выдается никаких исключений, даже сообщение журнала, указывающее на ошибку).

Вот код, который я использую:

private void deletAnimation()
    {
        Todo todoToDelete = App.ViewModel.Todos[1];

        Storyboard storyboard = new Storyboard();

        DoubleAnimation alphaAnim = new DoubleAnimation();
        alphaAnim.From = 1;
        alphaAnim.To = 0;
        alphaAnim.Duration = new Duration(TimeSpan.FromMilliseconds(500));
        ListBoxItem target = TodoList.ItemContainerGenerator.ContainerFromItem(todoToDelete) as ListBoxItem;
        Storyboard.SetTarget(alphaAnim, target);
        Storyboard.SetTargetProperty(alphaAnim, new PropertyPath(UIElement.OpacityProperty));

        storyboard.Children.Add(alphaAnim);

        for (int i = App.ViewModel.Todos.IndexOf(todoToDelete) + 1; i < App.ViewModel.Todos.Count; i++)
        {
            Todo todo = App.ViewModel.Todos[i];
            target = TodoList.ItemContainerGenerator.ContainerFromItem(todo) as ListBoxItem;

            DoubleAnimation translateAnim = new DoubleAnimation();
            translateAnim.From = target.RenderTransformOrigin.Y;
            translateAnim.To = target.RenderTransformOrigin.Y - target.ActualHeight;
            translateAnim.Duration = new Duration(TimeSpan.FromMilliseconds(500));
            translateAnim.BeginTime = TimeSpan.FromMilliseconds(500);

            Storyboard.SetTarget(translateAnim, target);
            Storyboard.SetTargetProperty(translateAnim, new PropertyPath(TranslateTransform.YProperty));

            storyboard.Children.Add(translateAnim);
        }

        storyboard.Begin();
    }

Некоторые вещи, которые я заметил при отладке:

  1. Свойство RenderTransformOrigin.Y всегда равно 0 независимо от того, на какой объект ListBoxItem имеется ссылка.
  2. Свойство Height имеет значение NaN, а свойство ActualHeight - 67
  3. Родительское свойство ListBoxItem имеет значение null

Эти две вещи заставляют меня задаться вопросом, дается ли мне ссылка на ListBoxItem, который не отображается на экране? Но поскольку анимация Opacity работает отлично, и весь мой список виден (на данный момент содержит только 3 элемента), я не понимаю, как это могло быть.

Я также пытался использовать PointAnimation и анимировать свойство RenderTransformOrigin напрямую, но это дало тот же результат (ничего такого).

Любая помощь приветствуется, спасибо!

1 Ответ

1 голос
/ 17 января 2012

Пожалуйста, проверьте эту ссылку:

http://blogs.msdn.com/b/jasongin/archive/2011/01/03/wp7-reorderlistbox-improvements-rearrange-animations-and-more.aspx

Кто-то создал класс, который вы можете легко включить в свое приложение. Здесь есть анимация для добавления / удаления элементов из вашего списка.

Это должно сэкономить вам много времени и разочарований.

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