加载动画时WPF数据触发器会导致闪光

时间:2017-07-19 04:18:50

标签: c# wpf storyboard

我有一个数据触发器,设置为false时隐藏带动画的相关控件。现在,当加载屏幕时,属性的值已经为假,它仍会运行动画并淡化控件,从而隐藏它们。

它会在屏幕上短暂闪现。

我希望这些控件在屏幕上保持隐藏,直到我将属性设置为true。

   <Window.Resources>
    <Style x:Key="somestyle" TargetType="Button">
        <Style.Triggers>
            <DataTrigger Binding="{Binding IsControlVisible,UpdateSourceTrigger=PropertyChanged}" Value="False">
                <DataTrigger.EnterActions>
                    <BeginStoryboard>
                        <Storyboard>
                            <DoubleAnimation Duration="0:0:1.5"  Storyboard.TargetProperty="Opacity" To="0" />
                        </Storyboard>
                    </BeginStoryboard>
                </DataTrigger.EnterActions>
                <DataTrigger.ExitActions>
                    <BeginStoryboard>
                        <Storyboard>
                            <DoubleAnimation Duration="0:0:1.5"  Storyboard.TargetProperty="Opacity" To="1" />
                        </Storyboard>
                    </BeginStoryboard>
                </DataTrigger.ExitActions>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Window.Resources>
<StackPanel VerticalAlignment="Center">
    <Button Width="100" Height="50" Content="Toggle Visibiity" Click="Button_Click"/>
    <Button Width="200" Height="50" Content="Something Something" Margin="0 20 0 0" Style="{StaticResource somestyle}"/>
</StackPanel>

1 个答案:

答案 0 :(得分:1)

问题在于,当加载控件并应用样式时,将评估触发器,并且由于最初IsControlVisiblefalse,因此启动第一个故事板,为{{1}设置动画从1(默认值)到0.因此解决方案是将初始Opacity值设置为0(或者更好的是,将值设置为与Opacity的初始值对应的值)。要做到这一点,只需在您的样式中添加适当的setter就足够了:

IsControlVisible

建议将绑定模式设置为<Style x:Key="somestyle" TargetType="Button"> <Setter Property="Opacity" Value="{Binding IsControlVisible, Mode=OneTime}" /> (...) </Style> ,以便在OneTime的值稍后更改时,IsControlVisible仅由动画而不是绑定控制。此外,我没有使用任何转换器,但事实证明该框架非常智能,可以正确地将Opacity转换为bool