gpt4 book ai didi

wpf - ListBox 项加载动画

转载 作者:行者123 更新时间:2023-12-04 11:14:51 24 4
gpt4 key购买 nike

我想用这样的动画创建基于 ListBox (ListView) 的用户控件:listbox 中的项目不会一次加载,它们必须逐步加载(逐项加载,然后是第二个,然后是第三个,等),它们之间有一些超时。

我怎样才能做到这一点?

最佳答案

您可以为此使用 Blend SDK 行为:

<ListBox ItemsSource="{Binding Collection, Source={StaticResource SampleData}}">
<i:Interaction.Behaviors>
<b:FadeAnimateItemsBehavior Tick="0:0:0.05">
<b:FadeAnimateItemsBehavior.Animation>
<DoubleAnimation From="0" To="1" Duration="0:0:0.3"/>
</b:FadeAnimateItemsBehavior.Animation>
</b:FadeAnimateItemsBehavior>
</i:Interaction.Behaviors>
</ListBox>
class FadeAnimateItemsBehavior : Behavior<ListBox>
{
public DoubleAnimation Animation { get; set; }
public TimeSpan Tick { get; set; }

protected override void OnAttached()
{
base.OnAttached();
AssociatedObject.Loaded += new System.Windows.RoutedEventHandler(AssociatedObject_Loaded);
}

void AssociatedObject_Loaded(object sender, System.Windows.RoutedEventArgs e)
{
IEnumerable<ListBoxItem> items;
if (AssociatedObject.ItemsSource == null)
{
items = AssociatedObject.Items.Cast<ListBoxItem>();
}
else
{
var itemsSource = AssociatedObject.ItemsSource;
if (itemsSource is INotifyCollectionChanged)
{
var collection = itemsSource as INotifyCollectionChanged;
collection.CollectionChanged += (s, cce) =>
{
if (cce.Action == NotifyCollectionChangedAction.Add)
{
var itemContainer = AssociatedObject.ItemContainerGenerator.ContainerFromItem(cce.NewItems[0]) as ListBoxItem;
itemContainer.BeginAnimation(ListBoxItem.OpacityProperty, Animation);
}
};

}
ListBoxItem[] itemsSub = new ListBoxItem[AssociatedObject.Items.Count];
for (int i = 0; i < itemsSub.Length; i++)
{
itemsSub[i] = AssociatedObject.ItemContainerGenerator.ContainerFromIndex(i) as ListBoxItem;
}
items = itemsSub;
}
foreach (var item in items)
{
item.Opacity = 0;
}
var enumerator = items.GetEnumerator();
if (enumerator.MoveNext())
{
DispatcherTimer timer = new DispatcherTimer() { Interval = Tick };
timer.Tick += (s, timerE) =>
{
var item = enumerator.Current;
item.BeginAnimation(ListBoxItem.OpacityProperty, Animation);
if (!enumerator.MoveNext())
{
timer.Stop();
}
};
timer.Start();
}
}
}
Tick指定项目开始淡入之间的时间间隔。 Animation是应用于淡入的不透明度的动画,它可以在 Xaml 中设置为非常可定制的(例如,缓动函数和淡入时间)。

编辑:添加了新项目淡入(仅在使用 ItemsSource 并实现 INotifyCollectionChanged 时才有效)

(如果有的话,请谨慎使用这样的代码片段。此代码主要用于演示目的,并提供有关如何实现这一点的一般概念。这也可以使用 Blend 4 的 native FluidMoveBehaviors(如果可用)来完成。)

关于wpf - ListBox 项加载动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5910215/

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