WPF加载动画时导致闪烁的数据触发器
我有一个数据触发器,它在设置为false时用动画隐藏相关控件。现在,当屏幕被加载时,属性的值已经是假的,仍然运行动画并淡化控件,从而隐藏它们。WPF加载动画时导致闪烁的数据触发器
它在屏幕上引起短暂的闪光。
我希望这些控件在屏幕上保持隐藏状态,直到将属性设置为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>
的问题是,当你的控制被装载并且应用样式,触发器被评估,并且由于最初IsControlVisible
是false
,第一故事板被启动时,动画的Opacity
从1(默认值),以0.因此,解决方法是将初始值Opacity
的值设置为0(或更好的是,将其初始值设为IsControlVisible
)。要做到这一点就足够了适当制定者添加到您的风格:
<Style x:Key="somestyle" TargetType="Button">
<Setter Property="Opacity" Value="{Binding IsControlVisible, Mode=OneTime}" />
(...)
</Style>
这是最好的结合模式为OneTime
,这样当IsControlVisible
变化后的值时,Opacity
仅由控制动画而不是绑定。此外,我没有使用任何转换器,但事实证明,框架足够智能,可以将bool
正确转换为double
。
你这一次都在哪里:-)。感谢它的魅力 – MegaMind
@惊人的知识! – Ramankingdom
在load方法中,使加载开始时的StackPanel visible = false。然后在加载面板中的最后一条指令使StackPanel可见= true。 – jdweng
@jdweng load方法中没有指令,所以只有两个语句是StackPanelVisible = false和StackPanelVisible = true – MegaMind
你说:“正在加载屏幕”。所以我想你的意思是构造?发生Initialize(),然后发生默认的Load()方法。所以你需要用三条指令来添加一个Load方法(不仅仅是你发布的两条指令)。第三条指令是调用visible = false和visible = true之间的base.Load()方法; – jdweng