2011-02-10 2 views
6

У меня есть эта анимация со мной, своего рода мигающая анимация, так что при нажатии кнопки прямоугольник «мигает». Я написал код для анимации, просто хотел узнать, есть ли лучший способ достичь этой анимации. Какие-либо предложения?Мигающая анимация WPF

код, как показано ниже:

<Window.Resources> 
    <Storyboard x:Key="OnClick1"> 
     <ObjectAnimationUsingKeyFrames Duration="0:0:10" Storyboard.TargetProperty="(UIElement.Visibility)" Storyboard.TargetName="rectangle"> 
      <DiscreteObjectKeyFrame KeyTime="0" Value="{x:Static Visibility.Collapsed}"/> 
      <DiscreteObjectKeyFrame KeyTime="0:0:0.1" Value="{x:Static Visibility.Visible}"/> 
      <DiscreteObjectKeyFrame KeyTime="0:0:0.2" Value="{x:Static Visibility.Collapsed}"/> 
      <DiscreteObjectKeyFrame KeyTime="0:0:0.3" Value="{x:Static Visibility.Visible}"/> 
      <DiscreteObjectKeyFrame KeyTime="0:0:0.4" Value="{x:Static Visibility.Collapsed}"/> 
      <DiscreteObjectKeyFrame KeyTime="0:0:0.5" Value="{x:Static Visibility.Visible}"/> 
      <DiscreteObjectKeyFrame KeyTime="0:0:0.6" Value="{x:Static Visibility.Collapsed}"/> 
      <DiscreteObjectKeyFrame KeyTime="0:0:0.7" Value="{x:Static Visibility.Visible}"/> 
      <DiscreteObjectKeyFrame KeyTime="0:0:0.8" Value="{x:Static Visibility.Collapsed}"/> 
      <DiscreteObjectKeyFrame KeyTime="0:0:0.9" Value="{x:Static Visibility.Visible}"/> 
     </ObjectAnimationUsingKeyFrames> 
    </Storyboard> 
</Window.Resources> 
<Window.Triggers> 
    <EventTrigger RoutedEvent="ButtonBase.Click" SourceName="button"> 
     <BeginStoryboard Storyboard="{StaticResource OnClick1}"/> 
    </EventTrigger> 
</Window.Triggers> 

<Grid x:Name="LayoutRoot"> 
    <Rectangle x:Name="rectangle" Fill="#FFF4F4F5" HorizontalAlignment="Left" Height="35" Margin="129,166,0,0" Stroke="Black" VerticalAlignment="Top" Width="73"/> 
    <Button x:Name="button" Content="Button" Margin="272,158,263,0" Height="37" VerticalAlignment="Top"/> 
</Grid> 
+0

Лучший способ не моргать. Тег '' окончательно погас; пусть успокоится. Есть причина, почему люди ненавидели это. –

+1

Преданный комментарий, @CodyGray – xr280xr

+0

Я чувствую, что вы должны использовать 'Hidden', а не' Collapsed' из-за последствий компоновки. – Gusdor

ответ

20

Вместо ObjectAnimationUsingKeyFrames анимации, вы можете использовать простой DoubleAnimation на Opacity свойство прямоугольника:

<Storyboard x:Key="OnClick1"> 
    <DoubleAnimation Storyboard.TargetName="rectangle" 
        Storyboard.TargetProperty="Opacity" 
        From="0" 
        To="1" 
        RepeatBehavior="10x" 
        AutoReverse="True" 
        Duration="0:0:0.1"/> 
</Storyboard> 
+1

Как можно сделать этот мигающий свет не затухающим? Подобно текстовому ящику – Mike

0

Здесь C# код версия для кого-то, кто нуждается это ...

if (IsImageBlinking) 
    { 
     DoubleAnimation da = new DoubleAnimation(); 

     da.From = 1.0; 
     da.To = 0.0; 
     da.RepeatBehavior = RepeatBehavior.Forever; 
     da.AutoReverse = true; 

     sb.Children.Add(da); 
     Storyboard.SetTargetProperty(da, new PropertyPath("(Image.Opacity)")); 
     Storyboard.SetTarget(da, image1); 
     sb.Begin(); 
    } 

С другой стороны, вы можете реализовать мигание для любого элемента управления, подобного этому.

<UserControl.Resources> 
     <Thickness x:Key="ControlMargin">0 5 0 0</Thickness> 
     <Storyboard x:Key="AlertArea" > 
      <DoubleAnimation Storyboard.TargetName="gdPersonData" 
        Storyboard.TargetProperty="Opacity" 
        From="0" 
        To="1" 
        RepeatBehavior="3x" 
        AutoReverse="True" 
        Duration="0:0:0.1"/> 
     </Storyboard> 
     <Storyboard x:Key="AlertArea2" > 
      <DoubleAnimation Storyboard.TargetName="gdPersonData" 
        Storyboard.TargetProperty="Opacity" 
        From="1" 
        To="0" 
        RepeatBehavior="1x" 
        AutoReverse="True" 
        Duration="0:0:0.1"/> 
     </Storyboard> 
    </UserControl.Resources> 

AlertArea является создание мигания 3 раза, и когда она будет закончена, мы должны восстановить Opacity с помощью AlertArea2.

В конструкторе UserControl/Window

.. 
Storyboard sb = this.FindResource("AlertArea") as Storyboard; 
sb.Completed += Sb_Completed; 
.. 

private void Sb_Completed(object sender, EventArgs e) 
{ 
    Storyboard sb2 = this.FindResource("AlertArea2") as Storyboard; 
    sb2.Begin(); 
} 

В том месте, вы должны начать мигать это сделать

Dispatcher.BeginInvoke((Action)(() => 
{ 
    Storyboard sb = this.FindResource("AlertArea") as Storyboard; 
    sb.Begin(); 
})); 
Смежные вопросы