【问题标题】:WPF: How do I initialize a property to be animated from the trigger that's animating it?WPF:如何初始化要从动画的触发器动画的属性?
【发布时间】:2018-04-16 10:27:54
【问题描述】:

在我看来,我有一个 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>

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

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

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

【问题讨论】:

    标签: wpf animation datatrigger


    【解决方案1】:

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

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

    这张图片中唯一缺少的部分是转换器,它应该与您的IsLessThanConverter 类似,除了它应该返回10 而不是分别falsetrue(比例应该是1如果计数不小于2,否则0)。请注意,将模式设置为 OneTime 很重要(在模式设置为 OneWay 的情况下,我在测试此解决方案时在某些情况下遇到了意外行为)。

    【讨论】:

    • 那是完美的。我认为这将是一个常见的动画初始化问题(它有点像依赖属性值优先级),但它只是一个普通的旧值初始化问题。感谢您的回答!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    • 2011-10-04
    • 1970-01-01
    • 1970-01-01
    • 2020-03-25
    相关资源
    最近更新 更多