WPF:如何从触发动画的触发器初始化要设置动画的属性?

时间:2017-11-03 16:06:34

标签: wpf animation datatrigger

我的视图中有一个网格,其可视性"取决于集合是否包含多个元素。随着元素的添加和删除,Grid需要进行动画扩展和折叠。我已经编写了一个DataTrigger,可以正常工作。

<DataTrigger Binding="{Binding Path=MyCollection.Count, Converter={StaticResource IsLessThanConverter}, ConverterParameter=2}" Value="True">
    <DataTrigger.EnterActions>
        <BeginStoryboard>
            <Storyboard TargetName="MyCollapsingGrid" TargetProperty="(FrameworkElement.LayoutTransform).(ScaleTransform.ScaleY)">
                <DoubleAnimation Duration="00:00:0.2"
                                EasingFunction="{StaticResource ExpoEaseInOut}"
                                To="0" />
            </Storyboard>
        </BeginStoryboard>
    </DataTrigger.EnterActions>
    <DataTrigger.ExitActions>
        <BeginStoryboard>
            <Storyboard TargetName="MyCollapsingGrid" TargetProperty="(FrameworkElement.LayoutTransform).(ScaleTransform.ScaleY)">
                <DoubleAnimation Duration="00:00:0.2"
                            EasingFunction="{StaticResource ExpoEaseInOut}"
                            To="1" />
            </Storyboard>
        </BeginStoryboard>
    </DataTrigger.ExitActions>
</DataTrigger>

我正在将网格的LayoutTransform初始化为默认的ScaleTransform

<Grid x:Name="MyCollapsingGrid">
    <Grid.LayoutTransform>
        <ScaleTransform />
    </Grid.LayoutTransform>
</Grid>

当我的视图使用包含两个元素的集合进行初始化并删除一个元素时,Grid动画会正确折叠。但是,当我使用带有一个元素的集合初始化我的视图时,它会在播放折叠动画时简要显示Grid。由于我已经使用触发器来执行此动画,因此当我的集合只有一个元素时,如何初始化Grid的LayoutTransform以使ScaleX为0,这样我就不会看到崩溃动画?

1 个答案:

答案 0 :(得分:1)

最简单的解决方案是将ScaleTransform.ScaleY属性与模式设置为OneTime绑定:

<ScaleTransform ScaleY="{Binding Path=MyCollection.Count,
                                 Converter={StaticResource TheMissingConverter},
                                 ConverterParameter=2,
                                 Mode=OneTime}" />

此图片中唯一缺少的是转换器,它应与IsLessThanConverter的工作方式类似,但它应返回10而不是false和{{1如果count不小于true,则缩放应为1,否则为2。请注意,将模式设置为0非常重要(模式设置为OneTime我在测试此解决方案时在某些情况下遇到了意外行为。)