2009-03-28 4 views
9

DoubleAnimation을 사용하여 RotationTransform의 Angle 속성을 분석합니다. 초당 몇 번씩, 외부 데이터에 대한 응답으로 회전 속도를 변경하여 회전 속도가 올라가거나/또는 시간이 지남에 따라 (부드럽게) 느려지도록해야합니다. WPF에서 회전 애니메이션을 동적으로 변경하십시오.

  • 가에 DoubleAnimation에 속도를 수정

    • 잡아 외부 데이터에서 새 값 : 나는 현재 기간 X와 0.0에서 360.0로 영원히 반복하는 DoubleAnimation, 초당 한 후 여러 번 사용하여이 작업을하고있는 중이 야 값은
    • 각도 속성에 다시

    주를 DoubleAnimation을 다시 적용 : 내가 찾았 어 내가 애니메이션에에 "현재의 각도"와 "현재의 각도 + 360"는 사람 및 속성에서 변경해야한다고 - 나에게 운이 좋다 RotationTransform은 각도에 문제가 없다. > 360도 - 0 각도에서 다시 회전을 시작하지 못하도록합니다.

    내 질문은 : 이것은 합리적입니까? 그렇게 보이지 않습니다. 계속해서 회전 변환의 Angle 속성에 새 DoubleAnimations를 적용하는 것은 잘못된 것처럼 보입니다. WPF가 회전을 애니메이션하게하는 것과 비슷합니다. I 자신이 회전 속도에 애니메이션을 적용하고 있습니다.

    더 좋은 방법이 있습니까?

  • 답변

    8

    스토리 보드에는 기간에 대한 배율 인 SpeedRatio 설정이 있습니다. 그러나 종속성 속성이 아니기 때문에이 속성에 바인딩 할 수 없습니다.

    이 문제를 해결하려면 스토리 보드에서 SetSpeedRatio 기능을 사용할 수 있습니다. 이 기능은 스토리 보드가 코드로 시작된 경우에만 작동합니다 (다른 오류가 발생하는 경우).

    아래 코드는 회전하는 사각형의 애니메이션 속도를 높이기 위해 개체에서 이벤트를 발생시키는 방법의 전체 예제입니다. 텍스트 상자 및 데이터 바인딩의 목적은 백그라운드 개체를 업데이트하는 것입니다. 버튼은 텍스트 상자가 포커스를 잃어 버리고 객체를 업데이트하기위한 것입니다.

    <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> 
    

    그런 다음 C# 코드

    { 
        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); } 
        } 
    } 
    

    난 당신이 사용에 적응할 수 확신합니다.

    +0

    대단히 감사하겠습니다. – Bill

    +1

    고마워, 나는 그것을 사용할 수있을 것이다. 우리가 메서드 호출 (SetSpeedRatio)을 만들어야한다는 것은 재미 있습니다. 즉, Xaml과 모두에서 다른 애니메이션으로 속도 비율 변경을 애니메이션으로 만들 수 없습니다. 그러나 이것은 항상 새로운 애니메이션을 적용하는 것보다 훨씬 효과적입니다. 감사합니다. – Bill

    +0

    이 답변은 우리의 경우에 가장 유용했지만 한 가지 중요한 차이점이 있습니다. 적어도 WinRT의 WPF를 사용하십시오. SetSpeedRatio() 메서드는 아무것도하지 않았으므로 SpeedRatio 속성으로 변경하여 트릭을 수행했습니다. –