C# Как избавиться от ColorAnimation и раскадровки, созданных программно?

#c# #uwp #visual-studio-2022 #winui-3

#c# #uwp #visual-studio-2022 #винуи-3

Вопрос:

я очень новичок в раскадровках и анимации.

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

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

Чтобы сделать этот процесс более эффективным с точки зрения памяти и процессора, я хотел бы создавать анимации «на лету», а не создавать ненужные анимации для каждого элемента, все работает нормально, за исключением того, что я чувствую, что мне нужно избавиться от них, чтобы освободить ненужное использование процессора и памяти, о чем я понятия не имею, как это сделать.

Ниже вы можете найти код события нажатия кнопки, которое выполняет всю операцию

employees_data_model.выбранный_пользовательский_контакт.DeleteEmployee = employees_data_model.выбранный_импланетный_контакт.DeleteEmployee == ложь; var _Container = Employees_List_View.ContainerFromItem(Employees_List_View.SelectedItem); var GridItem = Найти имя файла(_Container, «GridItem») в виде сетки;

 if (GridItem.Background == null)  GridItem.Background = new SolidColorBrush(ColorHelper.FromArgb(0, 0, 0, 0));   if (GridItemColorAnimation != null)  {  GridItemAnimationStoryBoard.Stop();  //Here i would like to dispose both GridItemColorAnimation and GridItemAnimationStoryBoard and create new instances below that target different item    }  GridItemColorAnimation = new ColorAnimation();  GridItemAnimationStoryBoard = new Storyboard();   var duration = new Duration(TimeSpan.FromMilliseconds(employees_data_model.selected_employee_contact.DeleteEmployee == true ? 300 : 1000));  GridItemColorAnimation.Duration = duration;  GridItemColorAnimation.EnableDependentAnimation = true;   Storyboard.SetTarget(GridItemColorAnimation, GridItem.Background);  Storyboard.SetTargetProperty(GridItemColorAnimation, "Color");  Storyboard.SetTargetName(GridItemColorAnimation, "GridItem.Background");  GridItemAnimationStoryBoard.Children.Add(GridItemColorAnimation);  GridItemAnimationStoryBoard.Duration = duration;  GridItemColorAnimation.To = employees_data_model.selected_employee_contact.DeleteEmployee == true ? ColorHelper.FromArgb(150, 255, 100, 100) : ColorHelper.FromArgb(0, 0, 0, 0);  GridItemAnimationStoryBoard.Begin();  

Заранее большое вам спасибо за весь ваш вклад.

РЕДАКТИРОВАТЬ: Хорошо, ребята, большое вам спасибо за вашу помощь, жаль, что мы никак не можем их освободить, я просто использую функцию .Stop() для каждой раскадровки и освобождаю их из списка раскадровок с помощью list.clear (), надеюсь, этого будет достаточно, и GC соберет их автоматически, если я узнаю, что в конце концов мне все равно придется вызвать сборщик мусора, так и быть, надеюсь, этого будет достаточно.

Еще раз спасибо за всю вашу помощь!

Ответ №1:

Как избавиться от созданных ColorAnimation и раскадровки

Производный от кода, на который, как вы обнаружите GridItemColorAnimation , ссылается вызывающий GridItemAnimationStoryBoard GridItemAnimationStoryBoard.Children.Add метод, поэтому мы не смогли выпустить GridItemColorAnimation напрямую. В общем случае UWP будет автоматически обновляться с помощью clr. Если вы хотите очистить его вручную, вы можете попробовать очистить GridItemAnimationStoryBoard коллекцию дочерних элементов, а затем установить ее как нулевую, а затем вызвать GC.Collect() метод.

Ответ №2:

Ни ColorAnimation то, ни другое или Storyboard реализовать IDisposable , поэтому они не должны и не могут быть утилизированы.

Что вам следует сделать, так это убедиться, что вы не сохраняете ссылку ни на один из этих объектов дольше, чем это необходимо. Если нет ссылки на объект, сборщик мусора в конечном итоге соберет его и, возможно, восстановит память.

Если вы создаете новый ColorAnimation и Storyboard и повторно добавляете в них свои свойства или переменные каждый раз, когда вызывается ваш метод, вы должны быть в порядке, предполагая, что вы не сохраняете ссылки на старые объекты, которые перезаписываются откуда-то еще.