0

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

换个说法:

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

闪烁似乎是,当删除展开并开始隐藏时,网格的高度短暂设置为 0。

触发器有效,但我认为对于那些关心的人的一些注意事项与手头的问题无关:

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

避免闪烁的想法?

4

1 回答 1

1

我有两个可能的建议给你,尽管它们只是……建议。第一个与BeginTime您为您设置的pStatusHide Storyboard...有关,如果您将其设置为,0:0:0那么它应该立即启动...也许半秒延迟是您看到闪烁的时候。

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

于 2013-09-02T21:21:33.473 回答