ItemsControl
現在、主にいくつかのアイテムを表示するだけのコントロールを作成しています。さらに、ユーザーがその中のアイテムをフィルタリングできるようにするいくつかのコントロールがありますItemsControl
。
私がやろうとしているのは、フィルターが適用されたときにどのアイテムが削除されるかをユーザーにわかりやすくすることです。
そのため、実際に をフィルタリングする代わりに、各アイテムに使用される VM にICollectionView
新しいプロパティを導入しました。IsVisible
次に、 にScaleTransform
asLayoutTransform
を追加し、変換をアニメーション化するためにDataTemplate
a を追加しました。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
「1」の ScaleY で が再作成され、次にDataTrigger
が再度適用され、スコアボードが再度適用されるためです。
この場合、アニメーションが発生しないことを望みます。
これを行う方法はありますか?ティア・マーティン