如何正确停止以编程方式声明的故事板
How to correctly stop a storyboard declared programmatically
我有一个 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();
}
}
}
我想我必须停止动画,但我不知道该怎么做?
谢谢
从Items_ItemChanged
中取出Storyboard
。
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();
}
}
}
问题是每次项目更改时您都在创建一个新的故事板,而不是重复使用现有的故事板:
var sb = new Storyboard();
如果您真的必须这样做,那么您需要处理故事板完成事件并将其从单元格中删除。
我有一个 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();
}
}
}
我想我必须停止动画,但我不知道该怎么做?
谢谢
从Items_ItemChanged
中取出Storyboard
。
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();
}
}
}
问题是每次项目更改时您都在创建一个新的故事板,而不是重复使用现有的故事板:
var sb = new Storyboard();
如果您真的必须这样做,那么您需要处理故事板完成事件并将其从单元格中删除。