2009-03-28 45 views
9

Tôi đang sử dụng DoubleAnimation để kích hoạt thuộc tính Angle của RotationTransform. Một vài lần mỗi giây, tôi cần phải thay đổi tốc độ quay để đáp ứng với dữ liệu bên ngoài sao cho tốc độ quay tăng lên và/hoặc chậm lại (suôn sẻ) theo thời gian. Tôi hiện đang làm điều này bằng cách sử dụng một DoubleAnimation mà lặp đi lặp lại mãi mãi ,0-360,0 với thời gian X, sau đó một vài lần mỗi giây:Tự động thay đổi hoạt ảnh xoay vòng trong WPF

  • Grab một giá trị mới từ dữ liệu bên ngoài
  • Sửa đổi tỷ lệ trên DoubleAnimation đó giá trị
  • Re-Áp dụng các DoubleAnimation đến tài sản góc lại

Lưu ý: tôi đã thấy rằng tôi đã phải thay đổi để Từ tài sản trên các hình ảnh động để "góc hiện tại" và "góc hiện tại + 360" - may mắn cho tôi RotationTransform không gặp khó khăn gì với góc độ > 360 độ - để tránh bắt đầu xoay vòng một lần nữa từ góc 0.

Câu hỏi của tôi là: Điều này có hợp lý không? Nó không có vẻ như vậy. Liên tục áp dụng DoubleAnimations mới cho thuộc tính Angle trên một biến đổi xoay có vẻ sai - giống như tôi cho phép WPF tạo hoạt ảnh cho vòng quay, trong khi I đang tự động tạo tốc độ quay.

Có cách nào tốt hơn không?

Trả lời

8

Trên bảng phân cảnh có cài đặt SpeedRatio là hệ số nhân với thời lượng. Bạn không thể liên kết với điều này tuy nhiên vì nó không phải là một thuộc tính phụ thuộc.

Để giải quyết vấn đề này, bạn có thể sử dụng chức năng SetSpeedRatio trên bảng phân cảnh. Lưu ý điều này chỉ hoạt động nếu bảng câu chuyện được bắt đầu bằng mã (khác khôn ngoan bạn nhận được một lỗi).

Mã dưới đây là ví dụ đầy đủ về cách bạn sẽ tăng sự kiện trong một đối tượng để thực hiện tốc độ hoạt ảnh của hình chữ nhật quay. Mục đích của hộp văn bản và các ràng buộc dữ liệu là cập nhật đối tượng nền. Nút chỉ là để hộp văn bản mất tập trung và cập nhật đối tượng.

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

Sau đó, C# code

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

tôi chắc chắn bạn có thể thích ứng với việc sử dụng của bạn.

+0

Điều đó sẽ được đánh giá cao rất nhiều. – Bill

+1

Cảm ơn, tôi sẽ có thể sử dụng nó. Buồn cười là chúng ta phải thực hiện một cuộc gọi phương thức (SetSpeedRatio), có nghĩa là tôi không thể tạo hiệu ứng thay đổi tỷ lệ tốc độ với một hoạt ảnh khác, tất cả trong Xaml và tất cả; nhưng điều này có vẻ chính xác hơn nhiều so với việc áp dụng các hoạt ảnh mới mọi lúc để có hiệu lực. Cảm ơn bạn. – Bill

+0

Câu trả lời này hữu ích nhất trong trường hợp của chúng tôi nhưng có một sự khác biệt quan trọng đã không làm cho nó hoạt động. ít nhất với WPF trong WinRT. Phương thức SetSpeedRatio() đã không làm bất cứ điều gì vì vậy chúng tôi đã thay đổi nó thành thuộc tính SpeedRatio và đã thực hiện điều đó. –

Các vấn đề liên quan