2011-04-11 23 views
7

xaml dosyasında bir animasyon film şeridi oluşturdum. Bu hikaye panosu Button.Click'te başlıyor. Ancak animasyonu durdurmak için özel etkinlikteki storyboard'u arka planda kodda durdurmaya çalışıyorum. Kod herhangi bir istisna atmıyor, ancak etkinliğim tetiklendiğinde animasyon hala devam ediyor.WPF animasyonu durdur, storyboard xaml içinde başlıyor ama codebehind içinde mi duruyor?

Sorunun Durma yöntemiyle olduğunu düşünüyorum. Durdur, animasyonu durdurmak için başlayan aynı nesneyi gerektirir. Ama burada storyboard WPF xaml'de başlıyor ve ben de arkada kodda duruyorum.

Herhangi bir çözüm, nasıl Xaml nesnesini kod arkasında veya bunun için herhangi bir alternatif çözüm elde etmek için?

XAML KODU: Arkasında

<Canvas.Triggers> 
      <EventTrigger RoutedEvent="Button.Click" SourceName="ScanButton"> 
       <EventTrigger.Actions> 
        <BeginStoryboard > 
         <Storyboard Name="MovingServer" Storyboard.TargetName="ImageMove" RepeatBehavior="Forever" > 
          <DoubleAnimation Storyboard.TargetProperty="(Canvas.Left)" Duration="0:0:2" From="30" To="300" BeginTime="0:0:0" /> 
          <DoubleAnimation Storyboard.TargetProperty="(Canvas.Left)" Duration="0:0:5" From="300" To="300" BeginTime="0:0:5" /> 
          <DoubleAnimation Storyboard.TargetProperty="(Canvas.Left)" Duration="0:0:2" From="300" To="600" BeginTime="0:0:7" /> 
          <DoubleAnimation Storyboard.TargetProperty="Opacity" Duration="0:0:2" From="1" To="0" BeginTime="0:0:7" /> 
         </Storyboard> 
        </BeginStoryboard> 
       </EventTrigger.Actions> 
      </EventTrigger> 

Kodu:

private void EventPublisher_OnScanningFinish(object sender, EventArgs args) 
    { 
     Dispatcher.Invoke(DispatcherPriority.Normal, (Action)delegate() { this.StopScanningAnimation(); }); 
    } 

    private void StopScanningAnimation() 
    { 

     ServerView.StoryBoardServerScrolling.Stop(this); //---------- Not Working 

     //this.ServerView.Server1Static.Visibility = System.Windows.Visibility.Hidden; 
     //this.ServerView.Server2Static.Visibility = System.Windows.Visibility.Hidden; 
     //this.ServerView.Server3Scrolling.Visibility = System.Windows.Visibility.Hidden; 
     //this.ServerView.SearchingGlass.Visibility = System.Windows.Visibility.Hidden; 
    } 

cevap

1

Güzel Fikirler verdiği için Timothy için minnettarım. İşte sana kaynakta film şeridini beyan etmek gerekmez bu çözüm ile bu

myStoryBoard.Stop(this.LayoutRoot); 

gibi storyboard sınıfının Stop() yöntemini kullanarak sorunu çözmek benim çalışma kodu

/*create this resources as global to that perticular xaml. Need not to be put it in App.xaml 
    MyControl could be Window or Page or UserControl */ 

     <MyControl.Resources> 
     <Storyboard x:Key="MovingServer" Storyboard.TargetName="MyImage" RepeatBehavior="Forever" > 
      <DoubleAnimation Storyboard.TargetProperty="(Canvas.Left)" Duration="0:0:2" From="30" To="300" BeginTime="0:0:0" /> 
      <DoubleAnimation Storyboard.TargetProperty="(Canvas.Left)" Duration="0:0:5" From="300" To="300" BeginTime="0:0:5" /> 
      <DoubleAnimation Storyboard.TargetProperty="(Canvas.Left)" Duration="0:0:2" From="300" To="600" BeginTime="0:0:7" /> 
      <DoubleAnimation Storyboard.TargetProperty="Opacity" Duration="0:0:2" From="1" To="0" BeginTime="0:0:7" /> 
     </Storyboard> 
    </MyControl.Resources> 

/* <!-- Now use those animation resources, the place where you want. You can use it as static resource and begin stop animation from code behind OR use it as trigger event --> */ 

/* <!-- Static resources--> */ 
    <Canvas> 
     <Image Canvas.Left="0" Canvas.Top="-2" Height="32" Name="MyImage" Width="32" Source="/CCTrayHelper;component/Images/ServerIcon.png" Visibility="Hidden"/> 
    <Canvas.Resources> 
     <BeginStoryboard x:Key="serverAnimate" Storyboard="{StaticResource MovingServer}" /> 
    </Canvas.Resources> 
    </Canvas> 
    <Button x:Name="ScanButton" onClick="Scanbutton_Click" /> 

/* ****************************************************************** */ 



    /* Code behind to start/stop animation*/ 

//Get the resource value first on current object, so that when you start/stop the animation, it work only on current object 
    Storyboard sbImageAnimate = (Storyboard)this.ServerView.FindResource("MovingServer"); 

//Start the animation on Button Click 
protected void Scanbutton_Click(object Sender, EventArgs e) 
    { 
    this.MyImage.Visibility = System.Windows.Visibility.Visible; 
    sbImageAnimate.Begin(); 
    } 

//Stop animation on my own even. You can use it on any event 
private void EventPublisher_OnFinish(object sender, EventArgs args) 
{ 
     Dispatcher.Invoke(DispatcherPriority.Normal, (Action)delegate() { this.StopScanningAnimation(); }); 
} 

private void StopScanningAnimation() 
    { 
    sbImageAnimate.Stop(); 
    this.MyImage.Visibility = System.Windows.Visibility.Hidden; 
    } 
7

statik kaynak olarak film şeridi tanımlayın,

<MyControl.Resources> 
         <Storyboard Key="MovingServer" Storyboard.TargetName="ImageMove" RepeatBehavior="Forever" > 
          <DoubleAnimation Storyboard.TargetProperty="(Canvas.Left)" Duration="0:0:2" From="30" To="300" BeginTime="0:0:0" /> 
          <DoubleAnimation Storyboard.TargetProperty="(Canvas.Left)" Duration="0:0:5" From="300" To="300" BeginTime="0:0:5" /> 
          <DoubleAnimation Storyboard.TargetProperty="(Canvas.Left)" Duration="0:0:2" From="300" To="600" BeginTime="0:0:7" /> 
          <DoubleAnimation Storyboard.TargetProperty="Opacity" Duration="0:0:2" From="1" To="0" BeginTime="0:0:7" /> 
         </Storyboard> 
</MyControl.Resources> 

ve aşağıdaki gibi arka uç koddan başvuru:

StoryBoard board = (StoryBoard)this.FindResource("MovingServer"); 
board.stop(); 
(i xaml tanımlanan olmadığını bilmek, ama burada olacağını nasıl yok düğmesinin 'tık' olaydan animasyonu başlatmak

eğer yapmış olsaydınız)

<Button x:Name="ScanButton" onClick="Scanbutton_Click"></button> 


protected void Scanbutton_Click(object Sender, EventArgs e) 
{ 
    StoryBoard board = (StoryBoard)this.FindResource("MovingServer"); 
    board.start(); 
} 
+0

Bunu test ettiniz mi? 'StaticResources'? 'Kaynaklar' demek istedin mi? X: Key'den ne haber? –

+0

Çalıştığım örnek bir kod için sınayın, ancak şu anki gerçek kodum çok uzun, bu yüzden – PawanS

+0

@ H.B alternatifleri için kullanıyorum. Üzgünüz, şu anda bu kodu test edemiyorum. StaticResources ile haklısınız, 'kaynaklar' olmalı, şu anda değiştireceğim. x: Anahtar; 'x:' kısmı isteğe bağlıdır –

3

ilanıyla.

+1

Bunu yapabilmek için, animasyonu başlattığınızda, ikinci parametreyi true olarak ayarlamanız gerekir: Begin (BağımlılıkObject ..., allowModification). – Sonhja

İlgili konular