我在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和BeginStoryBoard named Hide
之间设置为0,当它开始时将高度设置回全部量开始将其设置为0。
重新说明:
闪烁似乎是,当删除展开并隐藏开始时,网格的高度会暂时设置为0.
触发器有效,但在我看来,那些关心的人的一些注意事项与手头的问题无关:
self
是网格所在的用户控件StatusHeight
是一个依赖属性,默认为某个高度。MaxConverter
检查是否Items.Count >= MaxCountItems
MultiplyConverter
将Tag值与StatusHeight相乘,因此我可以将动画绑定到一个高度并避免冻结问题。请注意,动画从0到1和1到0。避免闪烁的想法?
答案 0 :(得分:1)
我有两个可能的建议,虽然他们只是......建议。第一个涉及您为BeginTime
设置的pStatusHide Storyboard
...如果您将其设置为0:0:0
那么它应该立即开始......也许半秒延迟是你看到了闪烁。
另一个建议是将RemoveStoryboard
替换为StopStoryboard
,甚至更改为PauseStoryboard
。这样,最后一个值将被保留,而不是(暂时)恢复为0.