2009-03-28 16 views
9

Bir RotationTransform öğesinin Açı özelliğini anamiate etmek için DoubleAnimation kullanıyorum. Saniyede birkaç kez, dönme hızını harici verilere yanıt olarak değiştirmem gerekir, böylece dönme hızlanır ve/veya zamanla yavaşça (yavaşça) yavaşlar. Dinamik olarak bir Rotasyon Animasyonunu WPF'de Değiştir

  • buna DoubleAnimation üzerine ücreti değiştirme

    • tut harici verilerden yeni değeri: Şu anda süresi X 0,0 360.0 sonsuza kadar tekrarlar bir DoubleAnimation, saniyede sonra birkaç kez kullanarak yapıyorum değeri
    • açı özelliğine tekrar

    Not DoubleAnimation Yeniden uygula: Ben buldunuz ben animasyon üzerinde etmek "geçerli açısını" ve "geçerli açı + 360" To ve özellikleri itibaren değiştirmek zorunda - Benim için şanslıyım RotationTransform'un açılarla ilgili bir sorunu yok > 360 derece - sıfırdan tekrar dönüşü engellemek için.

    Sorum şu: Bu uygun mu? Öyle görünmüyor. Dönme dönüşü üzerinde Angle özelliğine sürekli olarak yeni DoubleAnimations uygulamak yanlış görünüyor - WPF'nin dönüşü canlandırmasına benzer şekilde, I dönüş hızını kendim canlandırıyor.

    Daha iyi bir yolu var mı?

  • cevap

    8

    Hikaye panosunda, süreye çarpan bir SpeedRatio ayarı vardır. Buna bir bağımlılık özelliği olmadığı için bağlanamazsınız.

    Bu konudan kurtulmak için, storyboard üzerindeki SetSpeedRatio işlevini kullanabilirsiniz. Bu, sadece hikaye panosu kodda başlatılmışsa çalışır (başka bildiğinizde bir hata alırsınız).

    Aşağıdaki kod, bir eğirme dikdörtgeninin animasyon hızını etkilemek için bir nesnedeki olayı nasıl artacağınıza ilişkin tam bir örnektir. Metin kutusunun ve veri bağlarının amacı arka plan nesnesini güncellemektir. Düğme öyle ki metin kutusu odağı kaybeder ve nesneyi günceller.

    <Window x:Class="WpfApplication1.Window1" 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        Title="Window1" Height="300" Width="300"> 
        <StackPanel> 
         <Rectangle Margin="50" Width="50" Height="50" Fill="Red" x:Name="rc"> 
         <Rectangle.RenderTransform> 
          <RotateTransform x:Name="TransRotate" 
              CenterX="25" CenterY="25" Angle="0" /> 
         </Rectangle.RenderTransform> 
         <Rectangle.Resources> 
          <Storyboard x:Key="spin"> 
          <DoubleAnimation x:Name="da" 
              Storyboard.TargetName="TransRotate" 
              Storyboard.TargetProperty="Angle" 
              By="360" 
              Duration="0:0:10" 
              AutoReverse="False" 
              RepeatBehavior="Forever" /> 
          </Storyboard> 
         </Rectangle.Resources> 
         </Rectangle> 
         <TextBox Text="{Binding Speed}" /> 
         <Button>Update Speed</Button> 
        </StackPanel> 
    </Window> 
    

    Sonra C# kodu

    { 
        public Window1() 
        { 
         InitializeComponent(); 
    
         //create new object 
         BackgroundObject bo = new BackgroundObject(); 
    
         //binding only needed for the text box to change speed value 
         this.DataContext = bo; 
    
         //Hook up event 
         bo.SpeedChanged += bo_SpeedChanged; 
    
         //Needed to prevent an error 
         Storyboard sb = (Storyboard)rc.FindResource("spin"); 
         sb.Begin(); 
        } 
    
        //Change Speed 
        public void bo_SpeedChanged( object sender, int newSpeed) 
        { 
         Storyboard sb = (Storyboard)rc.FindResource("spin"); 
         sb.SetSpeedRatio(newSpeed); 
        } 
    } 
    
    public delegate void SpeedChangedEventHandler(object sender, int newSpeed); 
    
    public class BackgroundObject 
    { 
        public BackgroundObject() 
        { 
         _speed = 10; 
        } 
    
        public event SpeedChangedEventHandler SpeedChanged; 
    
        private int _speed; 
        public int Speed 
        { 
         get { return _speed; } 
         set { _speed = value; SpeedChanged(this,value); } 
        } 
    } 
    

    ben size kullanımına adapte eminim.

    +0

    Bu çok takdir edilecektir. – Bill

    +1

    Teşekkürler, bunu kullanabileceğim. Bir yöntem çağrısı yapmak zorunda olduğumuz için komik (SetSpeedRatio), yani hız oranı değişimini başka bir animasyonla canlandıramam, tüm Xaml ve hepsi; Ancak bu, efekti elde etmek için her zaman yeni animasyonlar uygulamaktan çok daha doğru görünüyor. Teşekkür ederiz. – Bill

    +0

    Bu cevap bizim durumumuzda en yararlı oldu ancak işe yaramayacak önemli bir fark var. En azından WinRT'de WPF ile. SetSpeedRatio() yöntemi hiçbir şey yapmadı, bu yüzden onu SpeedRatio'ya değiştirdik ve bu hile yaptı. –

    İlgili konular