WPF:如何初始化一个 属性 以从为其设置动画的触发器中设置动画?
WPF: How do I initialize a property to be animated from the trigger that's animating it?
我的视图中有一个 Grid,其 "visibility" 由集合是否具有多个元素决定。随着元素的添加和删除,该网格需要进行动画扩展和折叠。我已经写了一个 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 的 LayoutTransform 初始化为 0 的 ScaleX,这样我就看不到折叠动画?
最简单的解决方案是绑定 ScaleTransform.ScaleY
属性 并将模式设置为 OneTime
:
<ScaleTransform ScaleY="{Binding Path=MyCollection.Count,
Converter={StaticResource TheMissingConverter},
ConverterParameter=2,
Mode=OneTime}" />
这张图片中唯一缺少的是转换器,它应该与您的 IsLessThanConverter
类似地工作,除了它应该 return 1
和 0
而不是 false
和 true
(如果计数不小于 2
,则比例应为 1
,否则为 0
)。请注意,将模式设置为 OneTime
很重要(模式设置为 OneWay
我在测试此解决方案时在某些情况下遇到了意外行为)。
我的视图中有一个 Grid,其 "visibility" 由集合是否具有多个元素决定。随着元素的添加和删除,该网格需要进行动画扩展和折叠。我已经写了一个 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 的 LayoutTransform 初始化为 0 的 ScaleX,这样我就看不到折叠动画?
最简单的解决方案是绑定 ScaleTransform.ScaleY
属性 并将模式设置为 OneTime
:
<ScaleTransform ScaleY="{Binding Path=MyCollection.Count,
Converter={StaticResource TheMissingConverter},
ConverterParameter=2,
Mode=OneTime}" />
这张图片中唯一缺少的是转换器,它应该与您的 IsLessThanConverter
类似地工作,除了它应该 return 1
和 0
而不是 false
和 true
(如果计数不小于 2
,则比例应为 1
,否则为 0
)。请注意,将模式设置为 OneTime
很重要(模式设置为 OneWay
我在测试此解决方案时在某些情况下遇到了意外行为)。