C# 如何处理以编程方式创建的 ColorAnimation 和 Storyboard?
C# How to dispose ColorAnimation and Storyboard that are created programmatically?
我对故事板和动画还很陌生。
虽然它们的设置概念相当简单,但我一直在努力寻找一种有效的方法来销毁它们以在我的特定场景中保留内存。
基本上我有一个包含多个项目的列表视图(列表视图由数据库动态填充)当单击按钮时我希望列表视图项目对特定的 argb 颜色执行颜色动画,因为项目的数量是动态填充的,它可以有几十个或几百个项目。
为了使这个过程在内存和 cpu 方面更有效,我想即时创建动画,而不是每个项目都有不必要的动画,一切正常,除了我觉得我需要处理它们以释放不必要的 cpu 和我不知道该怎么做的内存使用量。
您可以在下面找到执行整个操作的按钮单击事件的代码
employees_data_model.selected_employee_contact.DeleteEmployee = employees_data_model.selected_employee_contact.DeleteEmployee == false;
var _Container = Employees_List_View.ContainerFromItem(Employees_List_View.SelectedItem);
var GridItem = FindMyChildByName(_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 会自动收集它们,如果我发现最后我仍然必须调用垃圾收集器,就这样吧,希望它就足够了。
再次感谢您的帮助!
How to dispose ColorAnimation and Storyboard that are created
从代码中推导出,GridItemColorAnimation
是通过调用GridItemAnimationStoryBoard.Children.Add
方法被GridItemAnimationStoryBoard
引用的,所以不能直接释放GridItemColorAnimation
。一般来说,UWP 会通过 clr 自动 gc。如果你确实想手动清理它,你可以尝试清除 GridItemAnimationStoryBoard
children 集合,然后将其设置为 null 然后调用 GC.Collect()
方法。
ColorAnimation
或 Storyboard
均未实施 IDisposable
,因此不应也不能处置它们。
您应该做的是确保您对这些对象中的任何一个的引用不会超过必要的时间。如果没有对对象的引用,垃圾收集器最终会收集它并且也许回收内存。
如果您创建一个新的 ColorAnimation
和 Storyboard
并在每次调用您的方法时重新评估这些属性或变量,假设您不保留对旧的引用,您应该没问题从其他地方覆盖的对象。
我对故事板和动画还很陌生。
虽然它们的设置概念相当简单,但我一直在努力寻找一种有效的方法来销毁它们以在我的特定场景中保留内存。
基本上我有一个包含多个项目的列表视图(列表视图由数据库动态填充)当单击按钮时我希望列表视图项目对特定的 argb 颜色执行颜色动画,因为项目的数量是动态填充的,它可以有几十个或几百个项目。
为了使这个过程在内存和 cpu 方面更有效,我想即时创建动画,而不是每个项目都有不必要的动画,一切正常,除了我觉得我需要处理它们以释放不必要的 cpu 和我不知道该怎么做的内存使用量。
您可以在下面找到执行整个操作的按钮单击事件的代码
employees_data_model.selected_employee_contact.DeleteEmployee = employees_data_model.selected_employee_contact.DeleteEmployee == false; var _Container = Employees_List_View.ContainerFromItem(Employees_List_View.SelectedItem); var GridItem = FindMyChildByName(_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 会自动收集它们,如果我发现最后我仍然必须调用垃圾收集器,就这样吧,希望它就足够了。
再次感谢您的帮助!
How to dispose ColorAnimation and Storyboard that are created
从代码中推导出,GridItemColorAnimation
是通过调用GridItemAnimationStoryBoard.Children.Add
方法被GridItemAnimationStoryBoard
引用的,所以不能直接释放GridItemColorAnimation
。一般来说,UWP 会通过 clr 自动 gc。如果你确实想手动清理它,你可以尝试清除 GridItemAnimationStoryBoard
children 集合,然后将其设置为 null 然后调用 GC.Collect()
方法。
ColorAnimation
或 Storyboard
均未实施 IDisposable
,因此不应也不能处置它们。
您应该做的是确保您对这些对象中的任何一个的引用不会超过必要的时间。如果没有对对象的引用,垃圾收集器最终会收集它并且也许回收内存。
如果您创建一个新的 ColorAnimation
和 Storyboard
并在每次调用您的方法时重新评估这些属性或变量,假设您不保留对旧的引用,您应该没问题从其他地方覆盖的对象。