2010-02-10 80 views
0

我目前正在创建一个控件,主要是一个ItemsControl显示一些项目。 此外,我有一些控件,允许用户筛选ItemsControl中的项目。HowTo动画过滤项目控件(WPF)中显示的项目

我想要做的是让用户更好地看到应用过滤器时删除哪些项目。

因此,我所做的并不是真正过滤ICollectionView,而是在用于每个项目的VM上引入了一个新属性IsVisible。 后来我加了ScaleTransform作为LayoutTransformDataTemplate,我增加了一个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,并重新应用记分牌。

在这种情况下,我希望没有动画发生。

任何想法如何做到这一点? tia Martin

回答

0

我找到了适用于我的解决方案。 我现在在我的虚拟机中创建ScaleTransform,并将其与DataTemplate中的LayoutTransform绑定。因此,对象始终保持不变,并且在重新创建DataTemplate后不会丢失其值。