2011-04-16 11 views
5

Estoy usando MVVM Light. He creado una ventana que se parece a esto:Ejecutar el código después de que finalice la animación

<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> 

Así que, básicamente, la MainViewModel es una clase de vista del modelo de la ventana. Contiene:

  • bool MyControlVisible propiedad que se enganchan a MyUserControl 's Visibility propiedad
  • RelayCommand RaiseMyControl comando cuyo propósito es establecer el valor de la propiedad MyControlVisible a true (por defecto es falso).

Al hacer clic en el botón en la ventana resulta en la aparición del MyUserControl - simple.

MyUserControl control de usuario se ve así:

<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> 

Una vez más, muy simple. El MyUserControlViewModel es una clase de modelo de vista para el control del usuario. Contiene:

  • string MyUserControlText propiedad que se enganchan a TextBlock 's Text propiedad
  • bool Fading propiedad que se enganchan a la plantilla de datos de frontera, y se utiliza para hacer el fundido frontera dentro o fuera
  • RelayCommand CloseMyControl comando que hace dos cosas: 1. Establece la propiedad Fading en false para hacer que el borde se desvanezca, y 2. establece la propiedad Visibility del control de usuario en Collapsed.

Aquí está el problema: cuando el Visibility se establece en Collapsed, el control de usuario desaparece. Necesito que desaparezca primero y luego desaparezca después. ¿Cómo puedo hacer que suceda? Gracias.

Respuesta

3

Dado que la visibilidad pertenece al fundido de salida, ejecutaría dos animaciones al mismo tiempo. Además de su animación de desvanecimiento (de cualquier tipo o compuesto que pueda ser), puede crear un ObjectAnimationUsingKeyFrames que establece la Visibilidad en el momento clave en que finaliza el desvanecimiento.

ejemplo XAML:

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

Además todos los guiones gráficos y animaciones tienen un evento Completed al que puede suscribirse y acaba de establecer el valor de inmediato.


Para dirigir la animación en otro uso de control Storyboard.Target para referencias complejas, o Storyboard.TargetName para referencia por su nombre.

para animar el control de usuario puede probar:

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

o

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

Ambos deben funcionar si el árbol lógico está intacto.

+0

@ H.B. ¡Hola de nuevo! :) Dado que la animación se establece en el borde y necesito 'Visibilidad' para orientar mi control de usuario, ¿cómo puedo hacer referencia a eso desde esta animación? – Boris

+0

Agregó más información sobre eso a la respuesta, vea si funciona. –

+0

Agregué el 'ObjectAnimationUsingKeyFrames', pero no colapsará la propiedad' Visibility'. Sigue siendo 'Visible'. Lo sé porque temporalmente establecí el color de fondo de la cuadrícula de diseño raíz en amarillo. Entonces, el borde se desvanece, pero el control permanece visible, es decir, amarillo. ¿Alguna idea? – Boris

0

Intentaré configurar la visibilidad en Colapsar como parte de la animación de fundido de salida, no en una línea separada en el comando CloseMyControl.

Cuestiones relacionadas