2010-02-26 29 views
8

Tôi đã tạo một lớp con đơn giản là StackPanel mà tôi có thể di chuyển xung quanh màn hình bằng cách sử dụng hoạt ảnh TranslateTransform. Có vẻ như sau:Tại sao những hoạt ảnh này không hoạt động khi tôi đang sử dụng bảng phân cảnh?

public class MovingStackPanel : StackPanel 
{ 
    public void BeginMove(Point translatePosition) 
    { 
     RenderTransform = new TranslateTransform(); 
     Duration d = new Duration(new TimeSpan(0, 0, 0, 0, 400)); 
     DoubleAnimation x = new DoubleAnimation(translatePosition.X, d); 
     DoubleAnimation y = new DoubleAnimation(translatePosition.Y, d); 
     /* 
     Storyboard.SetTarget(x, RenderTransform); 
     Storyboard.SetTargetProperty(x, new PropertyPath("X")); 

     Storyboard.SetTarget(y, RenderTransform); 
     Storyboard.SetTargetProperty(y, new PropertyPath("Y")); 

     Storyboard sb = new Storyboard(); 
     sb.Children.Add(x); 
     sb.Children.Add(y); 
     sb.Completed += sb_Completed; 
     sb.Begin(); 
     */ 
     RenderTransform.BeginAnimation(TranslateTransform.XProperty, x); 
     RenderTransform.BeginAnimation(TranslateTransform.YProperty, y); 
    } 

    void sb_Completed(object sender, EventArgs e) 
    { 
     Console.WriteLine("Completed."); 
    } 
} 

Và đây là vấn đề của tôi: Nếu tôi tạo hiệu ứng trực tiếp các thuộc tính X và Y, như mã bên trên, nó hoạt động. Nhưng nếu tôi sử dụng mã nhận xét ở trên nó, đó thực sự là sự sáng tạo đơn giản nhất của một mã số Storyboard có thể tưởng tượng được, không có gì xảy ra. Hoạt ảnh chạy - ít nhất, sự kiện đã hoàn thành được nâng lên - nhưng không có gì thay đổi trên màn hình.

Rõ ràng là tôi đang làm điều gì đó sai, nhưng tôi không thể thấy nó là gì. Mỗi ví dụ về cách tạo bảng phân cảnh trong mã tôi đã thấy trông giống như thế này. Rõ ràng là có điều gì đó về hoạt hình và bảng phân cảnh mà tôi chưa biết: nó là gì?

+1

FYI - Tôi đã đăng lỗi này trên Microsoft Connect. https://connect.microsoft.com/VisualStudio/feedback/details/723701/storyboard-settarget-only-works-on-uielements-but-throws-no-exception –

Trả lời

10

Khi nó quay ra, bạn không thể sử dụng cú pháp đường dẫn thuộc tính trong trường hợp này, vì thuộc tính đang hoạt ảnh không thuộc tính của FrameworkElement. Ít nhất, đó là cách tôi giải thích các ngoại lệ đáng chú ý bối rối mà tôi nhận được khi tôi thực hiện thay đổi mà Anvaka gợi ý:

Cannot automatically create animation clone for frozen property values on  
'System.Windows.Media.TranslateTransform' objects. Only FrameworkElement and 
FrameworkContentElement (or derived) types are supported. 

Để động đó, có vẻ như, tôi phải sử dụng một NameScope và sử dụng SetTargetName để đặt tên cho TransformElement . Sau đó, miễn là tôi vượt qua các FrameworkElement mà tôi đặt phạm vi tên trên phương pháp Begin, bảng phân cảnh có thể tìm thấy đối tượng và các thuộc tính và animate chúng và tất cả các công trình. Kết quả cuối cùng trông giống như sau:

public void BeginMove(Point translatePosition) 
{ 
    NameScope.SetNameScope(this, new NameScope()); 

    RenderTransform = new TranslateTransform(); 
    RegisterName("TranslateTransform", RenderTransform); 

    Duration d = new Duration(new TimeSpan(0, 0, 0, 0, 400)); 
    DoubleAnimation x = new DoubleAnimation(translatePosition.X, d); 
    DoubleAnimation y = new DoubleAnimation(translatePosition.Y, d); 

    Storyboard.SetTargetName(x, "TranslateTransform"); 
    Storyboard.SetTargetProperty(x, new PropertyPath(TranslateTransform.XProperty)); 

    Storyboard.SetTargetName(y, "TranslateTransform"); 
    Storyboard.SetTargetProperty(y, new PropertyPath(TranslateTransform.YProperty)); 

    Storyboard sb = new Storyboard(); 
    sb.Children.Add(x); 
    sb.Children.Add(y); 
    sb.Completed += sb_Completed; 

    // you must pass this to the Begin method, otherwise the timeline won't be 
    // able to find the named objects it's animating because it doesn't know 
    // what name scope to look in 

    sb.Begin(this); 

} 
7

Đó là cú pháp property path. Cách tiếp cận sau đây hoạt động:

public void BeginMove(Point translatePosition) 
{ 
    RenderTransform = new TranslateTransform(); 
    Duration d = new Duration(new TimeSpan(0, 0, 0, 0, 400)); 
    DoubleAnimation x = new DoubleAnimation(translatePosition.X, d); 
    DoubleAnimation y = new DoubleAnimation(translatePosition.Y, d); 

    Storyboard.SetTarget(x, this); 
    Storyboard.SetTargetProperty(x, 
       new PropertyPath("(UIElement.RenderTransform).(TranslateTransform.X)")); 

    Storyboard.SetTarget(y, this); 
    Storyboard.SetTargetProperty(y, 
       new PropertyPath("(UIElement.RenderTransform).(TranslateTransform.Y)")); 

    Storyboard sb = new Storyboard(); 
    sb.Children.Add(x); 
    sb.Children.Add(y); 
    sb.Completed += sb_Completed; 
    sb.Begin(); 

    //RenderTransform.BeginAnimation(TranslateTransform.XProperty, x); 
    //RenderTransform.BeginAnimation(TranslateTransform.YProperty, y); 
} 
Các vấn đề liên quan