none
Последовательное отображение в ListBox.Items RRS feed

  • Вопрос

  • Здравствуйте. Мне необходимо создать анимацию при последовательном отображении каждого Item из коллекции ListBox.Items, т.е. сначало один Item отобразился, затем следующий и т.д. Есть класс унаследованный от Grid - ListBoxBorder. В отдельном элементе создаю коллекцию

    ListBoxBorder List ListBoxCollection = new List();

    Привязываюсь к событию ListBox.Loaded и заполняю все Items из коллекции ListBoxCollection (для Item сво-во Width установленно в "0") Затем привязываюсь к событию ListBox.ItemContainerGenerator.StatusChanged, где создаю отдельный поток с указанием делегата. Вот код (для наглядности я построил анимацию наоборот - значение сво-ва Width уменьшается):

    private void ItemContainerGenerator_StatusChanged(object sender, EventArgs e)

    { if (ListReys.ItemContainerGenerator.Status == System.Windows.Controls.Primitives.GeneratorStatus­.ContainersGenerated)

    {

    ListReys.ItemContainerGenerator.StatusChanged -= ItemContainerGenerator_StatusChanged; Dispatcher.BeginInvoke(System.Windows.Threading.Di­spatcherPriority.Input, new VoidDelegate(DelayedAction));

    }

    }

    delegate void VoidDelegate();

    void DelayedAction() { for (int i = 0; i < ListReys.Items.Count; i++)

    { DoubleAnimation _s = new DoubleAnimation();

    _s.From = 220;

    _s.To = 0;

    _s.Duration = new Duration(new TimeSpan(0, 0, 0, 1, 0));

    _s.AutoReverse = false; listAnim.Children.Add(_s);

    var ups = ListReys.ItemContainerGenerator.

    ContainerFromIndex­(i) as ListBoxItem;

    Storyboard.SetTarget(_s, ups);

    Storyboard.SetTargetProperty(_s, new PropertyPath("Width"));

    listAnim.Begin();

    //listAnim.Completed += new EventHandler(MoveList); }

    }

    Проблема в том, что цикл не срабатывает, анимация происходит по принципу "все вдруг". нет ни какой последовательности. Что я сделал не правильно?

    16 июня 2011 г. 15:28

Ответы

  • Здравствуйте, можно сделать последовательное появляение с помощью таймера:

        public MainWindow()
        {
          InitializeComponent();
    
          listBox1.Loaded += new RoutedEventHandler(listBox1_Loaded);
        }
    
        private int currentIndex = 0;
    
        void listBox1_Loaded(object sender, RoutedEventArgs e)
        {
          for (int i = 0; i < 10; i++)
            listBox1.Items.Add("qwerty " + i);
    
          DispatcherTimer timer = new DispatcherTimer();
          timer.Interval = new TimeSpan(0, 0, 1);
          timer.Tick += new EventHandler(timer_Tick);
          timer.Start();
        }
    
        void timer_Tick(object sender, EventArgs e)
        {
          if (currentIndex < listBox1.Items.Count)
          {
            Storyboard listAnim = new Storyboard();
            DoubleAnimation _s = new DoubleAnimation();
            _s.From = 200;
            _s.To = 0;
            _s.Duration = new Duration(new TimeSpan(0, 0, 0, 1, 0));
            _s.AutoReverse = false;
    
            listAnim.Children.Add(_s);
            var ups = listBox1.ItemContainerGenerator.ContainerFromIndex(currentIndex) as ListBoxItem;
    
            Storyboard.SetTarget(_s, ups);
            Storyboard.SetTargetProperty(_s, new PropertyPath("Width"));
    
            listAnim.Begin();
    
            currentIndex++;
          }
          else
          {
            DispatcherTimer timer = sender as DispatcherTimer;
            timer.Stop();
            timer.Tick -= timer_Tick;
          }      
        }
    

     


    Для связи [mail]
    • Помечено в качестве ответа Abolmasov Dmitry 30 июня 2011 г. 12:27
    27 июня 2011 г. 8:34