动画结束后运行代码

时间:2011-04-16 02:35:28

标签: wpf xaml animation mvvm

我正在使用MVVM Light。我创建了一个如下所示的窗口:

<Window Name="MainWindow" ...>
  <Window.Resources>
    ...
    <viewModels:MainViewModel x:Key="mainVM" />
    ...
    <BooleanToVisibilityConverter x:Key="visConv" />
    ...
  </Window.Resources>

  <Grid DataContext="{StaticResource mainVM}>
    ...
    <Button Command="{Binding RaiseMyControl}" />
    ...
    <my:MyUserControl Visibility="{Binding MyControlVisible, 
        Converter={StaticResource visConv}}" />
  </Grid>

</Window>

基本上,MainViewModel是窗口的视图模型类。它包含:

  • bool MyControlVisible属性绑定到MyUserControl的{​​{1}} 属性
  • Visibility命令的目的是设置值 RelayCommand RaiseMyControl属性MyControlVisible(默认为false)。

单击窗口中的按钮会导致true的外观变得简单。

MyUserControl用户控件如下所示:

MyUserControl

再次,非常简单。 <UserControl ...> <UserControl.Resources> ... <viewModels:MyUserControlViewModel x:Key="userControlVM" /> ... </UserControl.Resources> <Grid DataContext="{StaticResource userControlVM}> ... <Border Width="200" Height="100" Background="Red"> <TextBlock Text="{Binding MyUserControlText}" /> </Border> <!-- This border has a DataTrigger bound to "bool Fading" property of the view model. When Fading is true, the border fades in through an animation. When it is false, the border fades out. --> ... <Button Command="{Binding CloseMyControl}" /> </Grid> </UserControl> 是用户控件的视图模型类。它包含:

  • MyUserControlViewModel属性绑定到string MyUserControlText的{​​{1}} 属性
  • TextBlock属性绑定到边框的数据模板,用于制作 边界淡入或淡出
  • Text命令执行两项操作:1。设置bool Fading 属于RelayCommand CloseMyControl以使边框淡出的属性,以及2.它设置Fading 用户控件的属性为false

问题在于:Visibility设置为Collapsed后,用户控件就会消失。我需要先淡出然后再消失。我怎样才能实现呢?谢谢。

2 个答案:

答案 0 :(得分:3)

由于可见性属于淡出,我会同时运行两个动画。除了您的淡入淡出动画(无论是何种类型或复合动画),您都可以创建一个ObjectAnimationUsingKeyFrames,在淡入淡出结束的关键时刻设置Visibiliy。

XAML示例:

<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility">
    <DiscreteObjectKeyFrame KeyTime="0:0:0.5">
        <DiscreteObjectKeyFrame.Value>
            <Visibility>Collapsed</Visibility>
        </DiscreteObjectKeyFrame.Value>
    </DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames>

此外,所有故事板和动画都有一个Completed事件,您可以订阅并立即设置该值。


要将动画指向另一个控件,请使用Storyboard.Target表示复杂参考,或Storyboard.TargetName按名称参考。

要为UserControl设置动画,您可以尝试:

Storyboard.Target="{Binding RelativeSource={RelativeSource AncestorType=UserControl}}"

Storyboard.Target="{Binding RelativeSource={RelativeSource AncestorType=my:MyUserControl}}"

如果逻辑树完好无损,两者都应该有效。

答案 1 :(得分:0)

我尝试将可见性设置为淡出动画的一部分,而不是CloseMyControl命令中的单独行。