我在 UserControl.Resources 中定义了这两个动画:
<Storyboard x:Key="pStatusExpand"
AccelerationRatio=".4"
DecelerationRatio=".4">
<DoubleAnimation Storyboard.TargetProperty="Tag"
Duration="0:0:0.6"
From="0" To="1"
/>
</Storyboard>
<Storyboard x:Key="pStatusHide"
AccelerationRatio=".4"
DecelerationRatio=".4">
<DoubleAnimation Storyboard.TargetProperty="Tag"
Duration="0:0:0.6"
From="1" To="0"
BeginTime="0:0:0.5"
/>
</Storyboard>
我使用以下触发器在它们所属的网格中为它们设置动画:
<Grid.Style>
<Style TargetType="{x:Type Grid}">
<Style.Triggers>
<DataTrigger Value="true">
<DataTrigger.Binding>
<MultiBinding Converter="{StaticResource MaxConverter}">
<Binding ElementName="self" Path="Items.Count" />
<Binding ElementName="self" Path="MaxCountItems" />
</MultiBinding>
</DataTrigger.Binding>
<DataTrigger.EnterActions>
<RemoveStoryboard BeginStoryboardName="Expand" />
<BeginStoryboard Name="Hide" Storyboard="{StaticResource pStatusHide}" />
</DataTrigger.EnterActions>
</DataTrigger>
<DataTrigger Binding="{Binding ElementName=self, Path=Items.Count}" Value="0">
<DataTrigger.EnterActions>
<RemoveStoryboard BeginStoryboardName="Hide" />
<BeginStoryboard Name="Expand" Storyboard="{StaticResource pStatusExpand}" />
</DataTrigger.EnterActions>
</DataTrigger>
</Style.Triggers>
</Style>
</Grid.Style>
动画调整网格的高度:
<Grid.Height>
<MultiBinding Converter="{StaticResource MultiplyConverter}">
<Binding ElementName="self" Path="StatusHeight" />
<Binding RelativeSource="{RelativeSource Self}" Path="Tag" />
</MultiBinding>
</Grid.Height>
我遇到的问题是,在RemoveStoryBoard named Expand
高度从其动画结束值 ~25 设置为 0 和BeginStoryBoard named Hide
, 当它开始时将高度设置回全部量以开始将其动画设置为 0 之间。
换个说法:
- Expand 动画触发是因为 Items.Count 等于 0。它将网格的高度增长/动画到 25。
- 加载一直持续到...
- Items.Count 现在等于 MaxCountItems 触发第二个触发器(用于隐藏)
- Expand 动画被删除(导致闪烁),但如果它没有被删除 - Hide 动画不会做任何事情(或看起来没有)。
闪烁似乎是,当删除展开并开始隐藏时,网格的高度短暂设置为 0。
触发器有效,但我认为对于那些关心的人的一些注意事项与手头的问题无关:
self
是网格所在的 UserControlStatusHeight
是一个依赖属性,默认为某个高度。MaxConverter
检查是否Items.Count >= MaxCountItems
MultiplyConverter
将 Tag 值与 StatusHeight 相乘,因此我可以将动画绑定到一个高度并避免冻结问题。注意,动画是从 0 到 1 和 1 到 0。
避免闪烁的想法?