2010-11-14 25 views
16

Estoy creando un tablero en WPF con un conjunto de indicadores clave de rendimiento, cada uno de los cuales consta de tres valores.¿Cómo hacer que un bloque de texto parpadee en wpf?

alt text

Siempre que los valores de cambio me gustaría que el control de usuario a parpadear durante 5 segundos. Me gustaría hacer que el color de fondo del control cambie el color de primer plano del bloque de texto y el color de primer plano del bloque de texto para cambiar al color de fondo del control de usuario.

Toda esta animación de WPF es nueva para mí, por lo que cualquier ayuda sería muy apreciada.

Mi control de usuario se parece a:

<Grid.RowDefinitions> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="10" /> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="10" /> 
     <RowDefinition Height="Auto" /> 
    </Grid.RowDefinitions> 

    <TextBlock x:Name="TitleTextBlock" Text="Title" FontSize="32" HorizontalAlignment="Center" Grid.Row="0" FontFamily="OCR-A II" Foreground="White" VerticalAlignment="Bottom" /> 
    <TextBlock x:Name="Value1TextBlock" Text="0" FontSize="192" HorizontalAlignment="Center" Grid.Row="2" FontFamily="OCR-A II" VerticalAlignment="Center" Foreground="White" /> 
    <TextBlock x:Name="Value2TextBlock" Text="0" FontSize="32" HorizontalAlignment="Center" Grid.Row="4" FontFamily="OCR-A II" Foreground="White" VerticalAlignment="Top" /> 

</Grid> 

Respuesta

33

Para hacer un abrir y cerrar TextBlock cuando su texto Cambia puede utilizar ColorAnimationUsingKeyFrames. El texto es vinculante para una propiedad llamada TextTitle.

<Window.Resources> 
    <Storyboard x:Key="blinkAnimation" Duration="0:0:5" > 
     <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(TextBlock.Background).(SolidColorBrush.Color)" 
             Storyboard.TargetName="TitleTextBlock" 
             AutoReverse="True"> 
      <ColorAnimationUsingKeyFrames.KeyFrames> 
       <DiscreteColorKeyFrame KeyTime="0:0:0" Value="White"/> 
       <DiscreteColorKeyFrame KeyTime="0:0:1" Value="Black"/> 
       <DiscreteColorKeyFrame KeyTime="0:0:2" Value="White"/> 
       <DiscreteColorKeyFrame KeyTime="0:0:3" Value="Black"/> 
       <DiscreteColorKeyFrame KeyTime="0:0:4" Value="White"/> 
      </ColorAnimationUsingKeyFrames.KeyFrames> 
     </ColorAnimationUsingKeyFrames> 

     <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(TextBlock.Foreground).(SolidColorBrush.Color)" 
             Storyboard.TargetName="TitleTextBlock" 
             AutoReverse="True"> 
      <ColorAnimationUsingKeyFrames.KeyFrames> 
       <DiscreteColorKeyFrame KeyTime="0:0:0" Value="Black"/> 
       <DiscreteColorKeyFrame KeyTime="0:0:1" Value="White"/> 
       <DiscreteColorKeyFrame KeyTime="0:0:2" Value="Black"/> 
       <DiscreteColorKeyFrame KeyTime="0:0:3" Value="White"/> 
       <DiscreteColorKeyFrame KeyTime="0:0:4" Value="Black"/> 
      </ColorAnimationUsingKeyFrames.KeyFrames> 
     </ColorAnimationUsingKeyFrames> 
    </Storyboard> 
</Window.Resources> 

<Grid Name="grid" Background="Black"> 
    <TextBlock x:Name="TitleTextBlock" Text="{Binding TextTitle, NotifyOnTargetUpdated=True}" FontSize="32" HorizontalAlignment="Center" Grid.Row="0" FontFamily="OCR-A II" Foreground="White" VerticalAlignment="Bottom" Background="Black"> 
     <TextBlock.Triggers> 
      <EventTrigger RoutedEvent="Binding.TargetUpdated"> 
       <EventTrigger.Actions> 
        <BeginStoryboard> 
         <StaticResource ResourceKey="blinkAnimation"/> 
        </BeginStoryboard> 
       </EventTrigger.Actions> 
      </EventTrigger> 
     </TextBlock.Triggers>  
    </TextBlock> 
</Grid> 

Esto hará que el TextBlock parpadee cada vez que su texto cambie. Tenga en cuenta que debe establecer Background y Foreground explícitamente en el TextBlock antes de usar la animación de parpadeo, de lo contrario recibirá una excepción System.InvalidOperationException: 'Background' no apunta a DependencyObject en la ruta '(0). (1)'.

actualización

Para iniciar esta animación de código subyacente que puede hacer esto.

Storyboard blinkAnimation = TryFindResource("blinkAnimation") as Storyboard; 
if (blinkAnimation != null) 
{ 
    blinkAnimation.Begin(); 
} 
+0

Digamos que quiero llamar a la animación para que parpadee ... ¿cómo podría hacerlo? – mattruma

+0

Supongo que estoy usando el mismo guión gráfico para varios TextBlocks. Si llamo a 'blinkAnimation.Begin();' ¿no parpadearán todos? ¿Qué pasa si quiero hacer que un determinado TextBlock parpadee? – epalm

Cuestiones relacionadas