2016-10-18 3 views
0

У меня есть приложение WPF, которое выполняет мигание ячейки, когда значение в источнике данных обновлено, и оно отлично работает.Как правильно остановить раскадровку, объявленную программным способом

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

private static DoubleAnimation blink = 
     new DoubleAnimation() 
     { 
      From = 0, 
      To = 1, 
      Duration = TimeSpan.FromSeconds(0.2), 
      FillBehavior = FillBehavior.Stop 
     }; 
private void Items_ItemChanged(object sender, ItemChangedEventArgs<ExpandoObject> e) 
    { 
     var club = e.Item; 
     var row = grid.ItemContainerGenerator.ContainerFromItem(club) as Telerik.Windows.Controls.GridView.GridViewRow; 
     if (row != null) 
     { 
      var column = grid.Columns[e.PropertyName]; 
      var cell = row.Cells.FirstOrDefault(c => c.Column == column); 
      if (cell != null) //In case of virtualization I won't have all the columns 
      { 
       Storyboard.SetTarget(blink, cell.Content as TextBlock); 
       Storyboard.SetTargetProperty(blink, new PropertyPath(Button.OpacityProperty)); 
       var sb = new Storyboard(); 
       sb.Children.Add(blink); 
       sb.Begin(); 
      } 
     } 
    } 

Я подозреваю, Я остановить анимацию, но я не знаю, как я ве сделать это?

Благодаря

ответ

1

Выньте Storyboard из Items_ItemChanged.

Storyboard sb = new Storyboard(); 
    private void Items_ItemChanged(object sender, ItemChangedEventArgs<ExpandoObject> e) 
    { 
     sb.Stop(); 
     sb.Children.Clear(); 

     sb.Children.Add(blink); 

     var club = e.Item; 
     var row = grid.ItemContainerGenerator.ContainerFromItem(club) as Telerik.Windows.Controls.GridView.GridViewRow; 
     if (row != null) 
     { 
      var column = grid.Columns[e.PropertyName]; 
      var cell = row.Cells.FirstOrDefault(c => c.Column == column); 
      if (cell != null) //In case of virtualization I won't have all the columns 
      { 
       Storyboard.SetTarget(blink, cell.Content as TextBlock); 
       Storyboard.SetTargetProperty(blink, new PropertyPath(Button.OpacityProperty)); 

       sb.Begin(); 
      } 
     } 
    } 
+0

Спасибо, таким образом я могу остановить это как-то или это просто отлично? – advapi

+0

@advapi проверить и рассказать – AnjumSKhan

+0

У вас больше нет памяти! – advapi

0

Проблема заключается в том, что вы создаете новую раскадровку каждый раз, когда изменяется пункт, а не повторное использование существующего:

var sb = new Storyboard(); 

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

Смежные вопросы