2011-01-11 4 views
6

Trong số Application.Resources Tôi có Storyboard được xác định sau.WP7 - Sử dụng bảng phân cảnh được xác định trong Application.Resources

<Application.Resources> 
    <!--Storyboard animation for fading out a UI element--> 
    <Storyboard x:Key="FadeOutAnimation"> 
    <DoubleAnimation From="1" 
        To="0" 
        Duration="0:0:0.25" 
        Storyboard.TargetProperty="Opacity" 
        AutoReverse="False" /> 
    </Storyboard> 
</Application.Resources> 

Ở mặt sau, tôi sử dụng điều này để làm mờ một số TextBlock khi người dùng chạm vào chúng.

// Get the storyboard from application resources 
Storyboard sb = (Storyboard)App.Current.Resources["FadeOutAnimation"]; 
// Setup the animation target for fade out 
Storyboard.SetTarget(sb.Children.ElementAt(0) as DoubleAnimation, myTextBlock); 
// Set the animation completed handler 
sb.Completed += (s, e1) => { 
    // Stop the Storyboard 
    sb.Stop(); 
    // Hide the TextBlock 
    myTextBlock.Visibility = Visibility.Collapsed; 
}; 
// Start the Storyboard 
sb.begin(); 

Câu hỏi đặt ra là, tôi cần phải bằng cách nào đó 'Unhook' myTextBlock từ là mục tiêu của DoubleAnimation?

Nếu có, tôi làm cách nào?

Lý do tôi hỏi là tôi lo lắng về việc tham chiếu đến số TextBlock đó treo xung quanh cho đến khi Bảng phân cảnh này được sử dụng lại.

Cảm ơn sự giúp đỡ của bạn!

Trả lời

12

Chúng tôi không luôn luôn phải sử dụng XAML trong sliverlight nếu nhận được nó theo cách của chúng tôi: -

public static AnimationHelper 
    { 
     public static void FadeOutAndCollapse(UIElement target) 
     { 
      DoubleAnimation da = new DoubleAnimation(); 
      da.From = 1.0; 
      da.To = 0.0; 
      da.Duration = TimeSpan.FromSeconds(0.25); 
      da.AutoReverse = false; 

      StoryBoard.SetTargetProperty(da, new PropertyPath("Opacity")); 
      StoryBoard.SetTarget(da, target); 

      StoryBoard sb = new StoryBoard(); 
      sb.Children.Add(da); 

      EventHandler eh = null; 
      eh = (s, args) => 
      { 
       target.Visiblity = Visibility.Collapsed; 
       sb.Stop(); 
       sb.Completed -= eh; 
      } 
      sb.Completed += eh; 

      sb.Begin(); 
     } 
} 

Với điều này trong nơi bạn có thể mờ dần và sụp đổ bất kỳ yếu tố UI với: -

AnimationHelper.FadeOutAndCollapse(myTextBox); 

Tôi muốn loại bỏ các From = 1.0 để làm cho nó tổng quát hơn để các yếu tố có độ mờ bắt đầu thấp hơn không đột nhiên nhấp nháy đến độ mờ đục đầy đủ trước khi biến mất.

+0

Bạn nói đúng, tốt hơn là làm điều này trong mã sau. – Praetorian

+0

@Praetorian: Không phải tất cả mã đều là "code-behind", ở trên không phải là. Bạn có thể tưởng tượng một lớp trợ giúp với một số phương thức hữu ích như vậy. Nó chỉ trở thành một phần của bộ công cụ của riêng bạn. – AnthonyWJones

+0

Điều gì là cần thiết để sử dụng thể hiện bảng phân cảnh? – kabuto178

0

Đừng lo lắng về việc đưa các tham chiếu đến các yếu tố giao diện người dùng nhẹ; chúng sẽ được thu gom rác khi không có thêm tài liệu tham khảo. Vấn đề bức xúc của bạn hơn là một bảng phân cảnh duy nhất đang được sử dụng cho nhiều đối tượng văn bản và nếu chúng chồng lên nhau, nó sẽ làm điều sai trái.

Ví dụ: nếu bạn bắt đầu một hoạt ảnh và sau đó bắt đầu một hoạt ảnh khác, thì cả hai sẽ dừng cùng một lúc vì chỉ có một bảng phân cảnh và cuộc gọi xử lý của bạn dừng. Hoặc là kết hợp một bảng phân cảnh riêng với mỗi phần tử văn bản trong XAML hoặc tạo một bảng phân cảnh mới trong đoạn mã phía sau cho mỗi hoạt ảnh mà bạn muốn thực hiện.

Ngoài ra, nếu bạn sử dụng một bảng phân cảnh, bạn nên cẩn thận xóa trình xử lý sự kiện đã hoàn thành của mình vì hiện tại bạn sẽ tiếp tục tích lũy chúng và trình xử lý cũ sẽ được gọi khi bảng phân cảnh hoàn thành lại.

+0

Vì bảng phân cảnh đang được bắt đầu bằng sự kiện nhấn và chỉ kéo dài một phần tư giây tôi không quá lo lắng về nhiều lần phát cùng lúc. Nhưng bạn có một điểm tốt về xử lý hoàn thành. Làm thế nào tôi có thể loại bỏ cái cuối cùng? Bởi vì tôi đang sử dụng một lambda tôi không biết làm thế nào để làm điều đó. – Praetorian