2012-12-26 4 views
-10

Storyboard 또는 준비 완료/이미 완료된 WPF를 사용하지 않아도 예쁜 효과를 얻으려고합니다.DispatcherTimer를 사용하여 C#에서 수동으로 WPF에서 매끄러운 효과 만들기

나는 부드러운 효과를 내기를 원한다. UI 요소가 2-3 초 동안 크기가 바뀌고 색상이 바뀌는 것과 같은 어떤 이벤트에서. 내가 부드럽고 예쁜 방식으로 만들고 싶은이 모든 것들.

내 효과의 각 프레임을 렌더링하는 등의 클래스가 준비되어 있습니다 : 여기

public static class ApplicationHelper 
{ 
     [SecurityPermissionAttribute(SecurityAction.Demand, 
     Flags=SecurityPermissionFlag.UnmanagedCode)] 
     public static void DoEvents(DispatcherPriority priority) 
     { 
      DispatcherFrame frame = new DispatcherFrame(); 
      DispatcherOperation oper = Dispatcher.CurrentDispatcher. 
          BeginInvoke(priority, 
          new DispatcherOperationCallback(ExitFrameOperation), 
          frame); 

      Dispatcher.PushFrame(frame); 
      if (oper.Status != DispatcherOperationStatus.Completed) 
      { 
       oper.Abort(); 
      } 
     } 

     private static object ExitFrameOperation(object obj) 
     { 
      ((DispatcherFrame)obj).Continue = false; 
      return null; 
     } 

     [SecurityPermissionAttribute(SecurityAction.Demand, 
     Flags=SecurityPermissionFlag.UnmanagedCode)] 
     public static void DoEvents() 
     { 
      DoEvents(DispatcherPriority.Background); 
     } 
} 

나는 그것이 DispatcherTimer 작업을 만들려고 노력 해요 :

void vb1_click(object sender, System.Windows.Input.MouseButtonEventArgs e) 
    { 
     DispatcherTimer dt = new DispatcherTimer(); 
     dt.Interval = new TimeSpan(0, 0, 0, 0, 500); 
     dt.Tick += new System.EventHandler(dt_Tick); 
     dt.Start(); 
    } 

    void dt_Tick(object sender, System.EventArgs e) 
    { 
     for(int i = 0; i < 20; i++) 
     { 
      this.vb2_blur_eff.Radius = (double)i; 
      ApplicationHelper.DoEvents();  
     } 
    } 

주요 문제가 있음을 나는 그것을 기다리고있어, 마지막 시간 (마지막 프레임이 렌더링되어야 할 때)에, 나는 모든 프레임을 매우 빠른 속도로 처리 할 것이지만, 실제로는 아무것도 없다.

어떻게 해결하고 완료/완료 한 물건을 사용하지 않고 순수한 C# 방식으로 완벽한 부드러운 효과를 만드시겠습니까?

감사합니다.

+2

왜 바퀴를 다시 만들겠습니까? – punker76

+0

@ punker76 – Secret

+0

을 구현하고 있지만 왜 시각적 상태 정보를 시각적 상태 정보 관리자와 함께 사용하지 않는 것이 좋을까요? – punker76

답변

2

dt_TickApplicationHelper.DoEvents()은 처리 할 이벤트가 없기 때문에 아무 것도하지 않습니다. 적어도 당신이 기대하는 것은 아닙니다. 내가 잘못 본게 아니라면

는 코드는 빠르게 Radius0에, 다음 1, 2 등 연속으로, 마지막에 19을 설정합니다. 이 모든 것은 500 밀리 초마다 발생합니다 (즉, Tick).

TickRadius을 하나의 값으로 설정하고 다음 Tick을 기다리는 것으로 생각할 수도 있지만 그렇지 않습니다. Tick 일 경우 Radius을 모든 값으로 설정하고 19으로 끝납니다. 그것이 당신이 겪고있는 것에 대한 하나의 가능한 설명입니다.

DoEvents 접근 방식에 대해서도 말씀 드리고 싶습니다. 그것은 가장 나쁜 생각입니다. 내가 DoEvents을 볼 때마다 나는 척추를 오싹하게한다. (그것은 10-15 년 전에 비틀 거리는 Visual Basic 5/6 코드를 생각 나게합니다.) 내가 본 것처럼, 이벤트 핸들러는 가능한 한 빨리 GUI 스레드를 제어해야합니다. 작업에 별다른 시간이 필요하지 않은 경우 해당 작업을 작업자 스레드에 위임해야합니다. 그리고 요즘에는 비동기 코드를 작성할 수있는 많은 옵션이 있습니다.