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 项有两种不同的视觉状态,可用于淡入或淡出。正如 Krishna 所提到的,唯一的方法是实现自定义功能来告诉项目它即将被删除并且它应该运行淡出动画。在该动画之后,可以从视觉/逻辑树中删除该项目。

于 2015-05-20T14:28:26.950 回答