动画列表框中已删除的项目

Bot*_*000 5 .net c# wpf xaml expression-blend

我的应用程序中有一些Listboxes绑定到ObservableCollections,我想动画一个项目,如果它被删除.

我已经发现了一个关于使用FrameworkElement.Loaded事件动画添加项目的问题,但当然这与Unloaded事件的工作方式不同.

有没有办法以可以在datatemplate中使用的方式执行此操作?

编辑:我已经连接到我的ItemsSource中的CollectionChanged事件,并尝试手动应用动画.目前它看起来像这样:

  ListBoxItem item = stack.ItemContainerGenerator.ContainerFromIndex(0) as ListBoxItem;
        item.LayoutTransform = new ScaleTransform(1, 1);

    DoubleAnimation scaleAnimation = new DoubleAnimation(); 
    scaleAnimation.From = 1; 
    scaleAnimation.To = 0; 
    scaleAnimation.Duration = new Duration(new TimeSpan(0, 0, 0, 0, 500));
    ScaleTransform transform = (ScaleTransform)item.LayoutTransform;
    transform.BeginAnimation(ScaleTransform.ScaleYProperty, scaleAnimation);
Run Code Online (Sandbox Code Playgroud)

问题是,它根本不起作用.该项目仍然只是弹出.当方法被调用时,该项目仍然存在,所以它不应该在它消失之前播放动画吗?或者我完全错了吗?

Bot*_*000 1

事实证明,即使我在删除它们之前引发了一个事件,它们也会立即被删除。因此,当我将它用作可观察堆栈时,我通过将已删除的元素保留在集合中并稍后将其删除来解决此问题。像这样:

public class ObservableStack<T> : ObservableCollection<T> 
{
    private T collapsed;
    public event EventHandler BeforePop;

    public T Peek() {
        if (collapsed != null) {
            Remove(collapsed);
            collapsed = default(T);
        }
        return this.FirstOrDefault();
    }

    public T Pop() {
        if (collapsed != null) { Remove(collapsed); }
        T result = (collapsed = this.FirstOrDefault());
        if (BeforePop != null && result != null) BeforePop(this, new EventArgs());
        return result;
    }

    public void Push(T item) {
        if (collapsed != null) {
            Remove(collapsed);
            collapsed = default(T);
        }
        Insert(0, item);
    }
}
Run Code Online (Sandbox Code Playgroud)

可能不是最好的解决方案,但它可以完成工作(至少如果我只将它用作堆栈)。