在"FrameworkElement.Loaded"之后和"Unloaded"之前播放动画(在 ListBoxItem 中)



ListBox:

<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)时不总是播放。这样的感觉,当一个项目已经创建,但还没有显示。当item被删除(FrameworkElement.Unloaded)时,动画不会播放。那么,如何解决呢?

您的Loaded故事板定义正确,因此应该有其他原因,为什么它有时正确播放,有时不。当一个新项目被添加到列表框时,UI线程上是否有一个长期的操作?这将导致一个冻结,使动画不能一直流畅地播放。

您的Unloaded故事板没有播放,因为当元素从用于渲染整个场景的视觉/逻辑树中移除时,会引发此事件。这个故事板应该在移除之前启动,但不幸的是,没有机制/事件告诉我们要移除一个项目。

目前在WPF中没有简单的方法从ItemsControl中淡出一个项目。在WinRT和Silverlight中,ItemsControl项有两种独立的视觉状态,可以用于渐入或渐出。正如Krishna所提到的,唯一的方法是实现自定义功能,告诉一个项目即将被删除,它应该运行淡出动画。在该动画之后,该项可以从可视化/逻辑树中删除。

相关内容

  • 没有找到相关文章

最新更新