故事板在删除和开始之间闪烁

时间:2013-09-02 21:06:49

标签: wpf xaml storyboard wpf-animation

我在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。

重新说明:

  1. 展开动画会触发,因为Items.Count等于0.它会将网格的高度增加/动画为25。
  2. 装载一直持续到......
  3. Items.Count现在等于激活第二个触发器(用于隐藏)的MaxCountItems
  4. 展开动画被删除(导致闪烁),但如果没有删除 - 隐藏动画不会做任何事情(或看起来没有)。
  5. 闪烁似乎是,当删除展开并隐藏开始时,网格的高度会暂时设置为0.

    触发器有效,但在我看来,那些关心的人的一些注意事项与手头的问题无关:

    • self是网格所在的用户控件
    • StatusHeight是一个依赖属性,默认为某个高度。
    • MaxConverter检查是否Items.Count >= MaxCountItems
    • MultiplyConverter将Tag值与StatusHeight相乘,因此我可以将动画绑定到一个高度并避免冻结问题。请注意,动画从0到1和1到0。

    避免闪烁的想法?

1 个答案:

答案 0 :(得分:1)

我有两个可能的建议,虽然他们只是......建议。第一个涉及您为BeginTime设置的pStatusHide Storyboard ...如果您将其设置为0:0:0那么它应该立即开始......也许半秒延迟是你看到了闪烁。

另一个建议是将RemoveStoryboard替换为StopStoryboard,甚至更改为PauseStoryboard。这样,最后一个值将被保留,而不是(暂时)恢复为0.