2012-02-07 108 views
3

如何停止動畫,以免產生Completed事件。下面是簡單的例子如何停止動畫WPF?

<Window x:Class="WpfApplication5.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="248" Width="318"> 
    <Grid> 
     <Border Width="20" Height="20" Background="Red" MouseEnter="Border_MouseEnter" MouseLeave="Border_MouseLeave" x:Name="border" /> 
    </Grid> 
</Window> 

和備份代碼:

private void Border_MouseEnter(object sender, MouseEventArgs e) 
{ 
    var a = new DoubleAnimation { To = 0, Duration = TimeSpan.FromMilliseconds(4000) }; 
    a.Completed += (obj, args) => MessageBox.Show("Boom!"); 
    border.BeginAnimation(Border.OpacityProperty, a); 
} 

private void Border_MouseLeave(object sender, MouseEventArgs e) 
{ 
    border.BeginAnimation(Border.OpacityProperty, null); 
    border.Opacity = 1; 
} 

如果我將鼠標移動之前的矩形變爲白色它仍然會在一段時間後顯示彈出式窗口。如何防止這一點?我們假設Border_MouseLeaveBorder_MouseEnter方法互不知道(它們不能將動畫實例變量傳遞給對方)。

回答

6

您可以使用此:

<Border Width="20" Height="20" Background="Red" x:Name="border" > 
       <Border.Triggers> 
        <EventTrigger RoutedEvent="MouseEnter"> 
         <BeginStoryboard Name="Ali"> 
          <Storyboard> 
           <DoubleAnimation To="0" Duration="0:0:4" Completed="com" Storyboard.TargetProperty="Opacity"/> 
          </Storyboard> 
         </BeginStoryboard> 
        </EventTrigger> 
        <EventTrigger RoutedEvent="MouseLeave"> 
         <StopStoryboard BeginStoryboardName="Ali"/> 
        </EventTrigger> 
       </Border.Triggers> 
      </Border> 

和:

private void com(object sender, EventArgs e) 
     { 
      MessageBox.Show("boom!"); 
     } 
1

你可以使用屬性或數據觸發的EnterActions和ExitActions屬性或@Ali所說的正確使用Begin和停止故事板。