2010-02-10 79 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後不會丟失其值。