【发布时间】:2011-01-15 04:31:21
【问题描述】:
我目前正在创建一个控件,该控件主要只是一个 ItemsControl 显示一些项目。
此外,我还有一些控件允许用户过滤 ItemsControl 中的项目。
我要做的是让用户更好地看到应用过滤器时删除了哪些项目。
所以我所做的不是真正过滤ICollectionView,而是在用于每个项目的VM 上引入了一个新属性IsVisible。
然后我在DataTemplate 中添加了ScaleTransform 作为LayoutTransform,并添加了DataTrigger 来为变换设置动画:
<Style x:Key="FilterCollapse" TargetType="{x:Type StackPanel}">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=IsVisible}" Value="False">
<DataTrigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetProperty="Opacity"
To="0"
Duration="0:0:0.5"/>
<DoubleAnimation Storyboard.TargetProperty="LayoutTransform.ScaleY"
To="0"
BeginTime="0:0:0.0"
Duration="0:0:0.5"/>
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
<DataTrigger.ExitActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetProperty="LayoutTransform.ScaleY"
To="1"
Duration="0:0:0.5"/>
<DoubleAnimation Storyboard.TargetProperty="Opacity"
To="1"
BeginTime="0:0:0.5"
Duration="0:0:0.5"/>
</Storyboard>
</BeginStoryboard>
</DataTrigger.ExitActions>
</DataTrigger>
</Style.Triggers>
</Style>
<DataTemplate x:Key="MyTemplate">
<StackPanel Style="{StaticResource FilterCollapse}">
<StackPanel.LayoutTransform>
<ScaleTransform ScaleX="1" ScaleY="1"/>
</StackPanel.LayoutTransform>
如果用户现在过滤一切正常。
但我遇到的问题是,如果列表中的任何更改(添加新项目,...)Storyboard 再次应用,尽管用户确实过滤了任何内容。
原因是,列表更改后,DataTemplate 将重新创建,ScaleY 为“1”,然后再次应用 DataTrigger,再次应用记分牌。
在这种情况下,我希望不发生动画。
任何想法如何做到这一点? 蒂亚 马丁
【问题讨论】:
标签: wpf animation datatemplate itemscontrol datatrigger