gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:11:57 24 4
gpt4 key购买 nike

我的应用程序中有一些列表框绑定(bind)到 ObservableCollections,如果它被删除,我想为它设置动画。

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

有什么方法可以在数据模板中使用吗?

编辑:我已连接到 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);

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

最佳答案

我通过向绑定(bind)项添加 IsRemoved 属性解决了这个问题。然后绑定(bind) ListViewItem 容器模板中的事件触发器,当此 bool 更改为 true 时播放移除动画。同时,一个 Task 以与动画持续时间相匹配的 Task.Delay(n) 开始,然后从集合中实际移除。请注意,此删除需要分派(dispatch)给拥有列表的线程以避免跨线程异常。

void Remove(MyItem item, IList<MyItem> list)
{
item.IsRemoved = true;

Task.Factory.StartNew(() =>
{
Task.Delay(ANIMATION_LENGTH_MS);
Dispatcher.Invoke(new Action(() => list.Remove(item)));
});
}

关于c# - 动画列表框中的已删除项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/791247/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com