ListBox:
<ListBox x:Name="ListBoxImages"
ScrollViewer.CanContentScroll="True"
UseLayoutRounding="False"
SelectionMode="Extended"/>
列表框风格:
<Style TargetType="{x:Type ListBox}">
...
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBox">
<Border Name="Border">
<ScrollViewer Focusable="false">
<WrapPanel ItemWidth="100"
IsItemsHost="True"/>
</ScrollViewer>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
和ListBoxItem样式(这里是动画,抱歉代码太长):
<Style TargetType="{x:Type ListBoxItem}">
<!--...-->
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBoxItem}">
<Border x:Name="border"
RenderTransformOrigin="0.5,0.5">
<Border.RenderTransform>
<TransformGroup>
<ScaleTransform x:Name="ScaleTransform"/>
</TransformGroup>
</Border.RenderTransform>
<ContentPresenter/>
</Border>
<!--Animation-->
<EventTrigger RoutedEvent="FrameworkElement.Loaded">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetName="ScaleTransform"
Storyboard.TargetProperty="ScaleX"
Duration="0:0:0.1"
From="0" To="1"/>
<DoubleAnimation Storyboard.TargetName="ScaleTransform"
Storyboard.TargetProperty="ScaleY"
Duration="0:0:0.1"
From="0" To="1"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
<EventTrigger RoutedEvent="FrameworkElement.Unloaded">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetName="ScaleTransform"
Storyboard.TargetProperty="ScaleX"
Duration="0:0:0.1"
To="0"/>
<DoubleAnimation Storyboard.TargetName="ScaleTransform"
Storyboard.TargetProperty="ScaleY"
Duration="0:0:0.1"
To="0"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
问题。动画添加元素(FrameworkElement.Loaded)时不总是播放。这样的感觉,当一个项目已经创建,但还没有显示。当item被删除(FrameworkElement.Unloaded)时,动画不会播放。那么,如何解决呢?
您的Loaded
故事板定义正确,因此应该有其他原因,为什么它有时正确播放,有时不。当一个新项目被添加到列表框时,UI线程上是否有一个长期的操作?这将导致一个冻结,使动画不能一直流畅地播放。
您的Unloaded
故事板没有播放,因为当元素从用于渲染整个场景的视觉/逻辑树中移除时,会引发此事件。这个故事板应该在移除之前启动,但不幸的是,没有机制/事件告诉我们要移除一个项目。
目前在WPF中没有简单的方法从ItemsControl
中淡出一个项目。在WinRT和Silverlight中,ItemsControl项有两种独立的视觉状态,可以用于渐入或渐出。正如Krishna所提到的,唯一的方法是实现自定义功能,告诉一个项目即将被删除,它应该运行淡出动画。在该动画之后,该项可以从可视化/逻辑树中删除。