1

私はリストボックスを持っています:

<ListBox x:Name="ListBoxImages"
         ScrollViewer.CanContentScroll="True"
         UseLayoutRounding="False"
         SelectionMode="Extended"/>

リストボックスのスタイル:

<Style TargetType="{x:Type ListBox}">
        ...
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ListBox">
                    <Border Name="Border">
                        <ScrollViewer Focusable="false">
                            <WrapPanel ItemWidth="100"
                                       IsItemsHost="True"/>
                        </ScrollViewer>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

および ListBoxItem スタイル (ここにアニメーション、長いコードで申し訳ありません):

<Style TargetType="{x:Type ListBoxItem}">
       <!--...-->
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type ListBoxItem}">
                    <Border x:Name="border"
                            RenderTransformOrigin="0.5,0.5">
                        <Border.RenderTransform>
                            <TransformGroup>
                                <ScaleTransform x:Name="ScaleTransform"/>
                            </TransformGroup>
                        </Border.RenderTransform>
                        <ContentPresenter/>
                    </Border>

                        <!--Animation-->

                        <EventTrigger RoutedEvent="FrameworkElement.Loaded">
                            <BeginStoryboard>
                                <Storyboard>
                                    <DoubleAnimation Storyboard.TargetName="ScaleTransform"
                                                     Storyboard.TargetProperty="ScaleX"
                                                     Duration="0:0:0.1"
                                                     From="0" To="1"/>
                                    <DoubleAnimation Storyboard.TargetName="ScaleTransform"
                                                     Storyboard.TargetProperty="ScaleY"
                                                     Duration="0:0:0.1"
                                                     From="0" To="1"/>
                                </Storyboard>
                            </BeginStoryboard>
                        </EventTrigger>

                        <EventTrigger RoutedEvent="FrameworkElement.Unloaded">
                            <BeginStoryboard>
                                <Storyboard>
                                    <DoubleAnimation Storyboard.TargetName="ScaleTransform"
                                                     Storyboard.TargetProperty="ScaleX"
                                                     Duration="0:0:0.1"
                                                     To="0"/>
                                    <DoubleAnimation Storyboard.TargetName="ScaleTransform"
                                                     Storyboard.TargetProperty="ScaleY"
                                                     Duration="0:0:0.1"
                                                     To="0"/>
                                </Storyboard>
                            </BeginStoryboard>
                        </EventTrigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

質問。要素 (FrameworkElement.Loaded) を追加するときのアニメーションが常に再生されるわけではありません。アイテムが作成されたが、まだ表示されていないときに再生されるような感覚。アイテム削除時(FrameworkElement.Unloaded)のアニメーションが再生されません。それで、それを修正する方法は?

4

1 に答える 1

2

ストーリーLoadedボードは正しく定義されているため、正しく再生される場合とそうでない場合がある理由は他にもあるはずです。リスト ボックスに新しい項目が追加されたときに、UI スレッドに長時間実行される操作はありますか? これによりフリーズが発生し、アニメーションが常にスムーズに再生されなくなります。

シーン全体のレンダリングに使用されるビジュアル/論理ツリーから要素が削除されると、このイベントが発生するため、Unloadedストーリーボードは再生されません。このストーリーボードは、この削除の前に開始する必要がありますが、残念ながら、アイテムを削除する必要があることを伝えるメカニズム/イベントはありません。

ItemsControl現在、WPFからアイテムをフェードアウトする簡単な方法はありません。WinRT と Silverlight には、フェードインまたはフェードアウトに使用できる ItemsControl 項目の 2 つの個別の視覚的状態があります。クリシュナが言ったように、唯一の方法はカスタム機能を実装して、削除しようとしていることとフェードアウト アニメーションを実行する必要があることをアイテムに伝えることです。そのアニメーションの後、ビジュアル/論理ツリーからアイテムを削除できます。

于 2015-05-20T14:28:26.950 に答える