2013-05-31 7 views
2

WPF에서 프로그래밍 방식으로 눈금의 위치를 ​​변경하는 간단한 응용 프로그램을 만들고 있습니다. 어떻게됩니까C# WPF GUI 및 이동 표 업데이트

Grid G = new Grid(); 

    private void Window_Loaded_1(object sender, RoutedEventArgs e) 
    { 
     Thread tt = new Thread(() => 
     { 
      Dispatcher.Invoke((MethodInvoker)delegate { RUN(); }); 

     }); tt.Start(); 
    } 

    private void RUN() 
    { 
     G.Margin = new Thickness(0, MAIN_GRID.ActualHeight, 0, 0); 
     G.Visibility = System.Windows.Visibility.Visible; 
     G.Background = System.Windows.Media.Brushes.Black; 

     MAIN_GRID.Children.Add(G); 

     while (G.Margin.Top > 0) 
     { 
      G.Margin = new Thickness(0, G.Margin.Top - 1, 0, 0); 

      MAIN_GRID.InvalidateVisual(); // tried refreshing the GUI but no good... 

      Thread.Sleep(10); 
     } 
    } 

:

그래서 내가이 코드를 썼다 .. 주요 목적은 버튼을 클릭하고 그리드는 왼쪽, 오른쪽, 위, 아래 등으로 이동이 시작됩니다 그것은 내가 필요로하는 것을 정확하게하지만 애니메이션을 보여주지 않고 있다는 것입니다.

예를 들어 내 코드는 그리드를 1 픽셀 씩 위로 움직여야하고 10 밀리 초 동안 잠자기 상태이면 실제로 움직이는 그리드를 볼 수 있습니다.

대신에 고정시키고 일단 완료되면 그리드의 최종 위치를 보여줍니다.

나는 스레딩을 사용하는 Windows 응용 프로그램에서만이를 수행하므로 제대로 작동합니다. 하지만 나는 그것이 더 매끄러 워야하기 때문에 WPF에서 그렇게해야했습니다.

+1

이것은'WinForms'에서 작동합니까? 'Thread.Sleep' 직후의'Application.DoEvents()'와 같은 의문의 여지가 없으면'WinForms'을 사용하여 똑같은 문제를 경험할 것이라고 기대합니다. 아래 Garry의 조언을 듣고 스토리 보드를 찾아보십시오. 이것은 Flash에서 타임 라인을 만드는 것과 매우 유사하며, 애니메이션은 거의 비슷합니다 (WinForms를 사용하여 할 수있는 것 이상의 광년입니다). –

+0

@ GrantWinney 저는 실제로 Windows 양식에서 스레딩을 사용하고있었습니다. – BOSS

+1

아, 다음 위치를 결정한 다음 별도의 스레드 (예 : BackgroundWorker)가 메인 UI 스레드로 다시 전송되는 것을 볼 수 있습니다. 어쨌든 스토리 보드와 함께 행운을 빌어 요! –

답변

2

'while'루프가 UI 스레드를 잠그고 점진적 변경이 나타나지 않도록합니다. 두 개의 대안은 1 루프의 본문을 Dispatcher에 의해 호출되는 메소드로 랩핑 (따라서 사용자 표면을 갱신하기 위해 UI 스레드를 비 웁니다)입니다.

또는 [2] Margin Top에서 DoubleAnimation을 사용하는 스토리 보드를 동적으로 만듭니다. [2]를 사용하면 운동량을 미리 측정해야하지만 그리드가 최종 목적지에 가까워지면 인상적인 이징 기능을 추가하려는 경우 가치가있을 수 있습니다.

1은 구현이 가장 빠르며, [2]는 매끄러운 시각 효과를 허용합니다. msdn docs are here

+0

나는 당신이 의미하는 것을 이해할 수 없었다. 코드 샘플을 제공해 주시겠습니까? – BOSS

+0

@BOSS Storyboards의 개념이 새로운 경우 개념을 이해하기 위해 먼저 개요를 살펴볼 수 있습니다. WPF에서 어떻게 사용하는지에 대한 이론이 있으면 매우 간단합니다. 그러나 코드로 바로 넘어 가기를 원한다면 MSDN에 훌륭한 샘플이 있습니다. http://msdn.microsoft.com/en-us/library/ms754066.aspx 그들은 필요한 방식으로 정확하게 속성에 애니메이션을 적용합니다. 샘플에서는 너비 속성이고, 경우에 따라 마진 상단 속성입니다. 약 8 줄 또는 9 줄의 코드가 필요한 것입니다 ... –

+0

와우, 끝내 줘요. 멋진 리소스를 제공해 주셔서 감사합니다. – BOSS