2012-10-05 22 views
5

Tôi đã Hoa trực quan sau đây được xác định:VisualStateManager không thể tạo hiệu ứng chuyển tiếp cho ThicknessAnimations

<VisualStateManager.VisualStateGroups> 
    <VisualStateGroup Name="EditStates"> 

     <VisualStateGroup.Transitions> 
      <VisualTransition GeneratedDuration="0:0:2"/> 
     </VisualStateGroup.Transitions> 

     <VisualState Name="Editing" />       
     <VisualState Name="Normal"> 
      <Storyboard> 
       <ThicknessAnimation Storyboard.TargetName="ViewBorder" Storyboard.TargetProperty="Margin" To="0" Duration="0"/> 
       <DoubleAnimation Storyboard.TargetName="Header"  Storyboard.TargetProperty="(FrameworkElement.LayoutTransform).(ScaleTransform.ScaleY)" To="0" Duration="0"/> 
       <ColorAnimation  Storyboard.TargetName="EditBorder" Storyboard.TargetProperty="Background.Color" To="Red" Duration="0"/> 
      </Storyboard> 
     </VisualState>           

    </VisualStateGroup> 
</VisualStateManager.VisualStateGroups> 

Các mỹ DoubleAnimationColorAnimation làm việc, với hình ảnh động chuyển VisualStateManager tạo hơn 2 giây cho họ.

Tuy nhiên, ThicknessAnimation không hoạt ảnh. Thay vào đó nó snaps để kết thúc giá trị vào cuối thời kỳ chuyển tiếp.

Có cách nào để nhận được VisualStateManager để tạo chuyển tiếp cho nó hay tôi sẽ bị buộc phải cung cấp chuyển tiếp thủ công?

+0

Tôi nhận thấy điều tương tự. Khi bạn sử dụng Blend trực quan để kéo một cạnh ra nó hoạt động nội bộ bằng cách sử dụng RenderTransform. Việc sửa đổi ký quỹ bằng tay có cùng tác dụng. Tôi đoán đó là một lỗi hoặc không được thực hiện tính năng .. – Wouter

Trả lời

2

tôi đã phân tích vấn đề và bắn lên .NET Reflector và phát hiện ra rằng VisualStateManager chỉ hỗ trợ các hình ảnh động sau:

  • ColorAnimation
  • DoubleAnimation
  • PointAnimation

Đó là loại crappy, bởi vì nó không được ghi lại ở bất cứ đâu.

Để chứng minh rằng nó không thể tạo hoạt ảnh, hãy xem mã đảo ngược của phương thức VisualStageManager.GenerateToAnimation. Ngoài ra còn có một số VisualStageManager.GenerateFromAnimation hỗ trợ cùng một tập con của hoạt ảnh.

private static Timeline GenerateToAnimation(FrameworkElement root, Timeline timeline, IEasingFunction easingFunction, bool isEntering) 
{ 
    Timeline destination = null; 

    if (destination == null) 
    { 
    var targetColor = GetTargetColor(timeline, isEntering); 
    if (targetColor.HasValue) 
     destination = new ColorAnimation { To = targetColor, EasingFunction = easingFunction }; 
    } 

    if (destination == null) 
    { 
    var targetDouble = GetTargetDouble(timeline, isEntering); 
    if (targetDouble.HasValue) 
     destination = new DoubleAnimation { To = targetDouble, EasingFunction = easingFunction }; 

    } 

    if (destination == null) 
    { 
    var targetPoint = GetTargetPoint(timeline, isEntering); 
    if (targetPoint.HasValue) 
     destination = new PointAnimation { To = targetPoint, EasingFunction = easingFunction }; 
    } 

    if (destination != null) 
    CopyStoryboardTargetProperties(root, timeline, destination); 

    return destination; 
} 

Bottomline ... Bạn chỉ có thể sử dụng hoạt ảnh Màu, Đôi hoặc Điểm trong VisualStageManager. Hoàn nguyên về trình kích hoạt cũ nếu bạn cần một thứ gì đó khác ...

+0

Bực bội nhưng hữu ích! Chúc mừng. – GazTheDestroyer

0

Có lẽ câu lệnh Độ phân giải độ dày của bạn chưa hoàn thành, tôi tìm kiếm mẫu mã đang chảy từ MSDN trong chủ đề "Lớp phân loại độ dày".

<ThicknessAnimation 
        Storyboard.TargetProperty="BorderThickness" 
        Duration="0:0:1.5" FillBehavior="HoldEnd" From="1,1,1,1" To="28,14,28,14" /> 

Hy vọng điều này có thể giúp bạn ...

+0

Cảm ơn, nhưng tiếc là đây là một hình ảnh động. VisualStates yêu cầu các bảng phân cảnh tĩnh vì chúng thiết lập các trạng thái đã biết. Tôi có thể định nghĩa ở trên như một quá trình chuyển đổi nhưng đây là những gì tôi đang cố gắng tránh. – GazTheDestroyer

+0

OK, rõ ràng với tôi bây giờ –

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