0

ItemsControl現在、主にいくつかのアイテムを表示するだけのコントロールを作成しています。さらに、ユーザーがその中のアイテムをフィルタリングできるようにするいくつかのコントロールがありますItemsControl

私がやろうとしているのは、フィルターが適用されたときにどのアイテムが削除されるかをユーザーにわかりやすくすることです。

そのため、実際に をフィルタリングする代わりに、各アイテムに使用される VM にICollectionView新しいプロパティを導入しました。IsVisible次に、 にScaleTransformasLayoutTransformを追加し、変換をアニメーション化するためにDataTemplatea を追加しました。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が再度適用され、スコアボードが再度適用されるためです。

この場合、アニメーションが発生しないことを望みます。

これを行う方法はありますか?ティア・マーティン

4

1 に答える 1

0

自分に合った解決策を見つけました。ScaleTransformVM で を作成し、LayoutTransformから にバインドしていDataTemplateます。このため、オブジェクトは常に同じままであり、DataTemplate再作成されてもその値を失うことはありません。

于 2010-02-12T10:09:02.133 に答える