2013-07-18 2 views
1
이 진짜 머리 아마추어 괜찮

동안 :WPF 창 이미지를하지 않을 경우 루프

나는 이미지를 일으키는 메뉴 항목을 선택하면 전체 창 (A writeableBitmap)로를 구성하는 일부 픽셀이 그려지면 제대로 표시됩니다.

그러나 루프를 완료하면 루프가 완료되고 다섯 번째 다시 그려진 비트 맵이 올바르게 표시 될 때까지 비트 맵의 ​​그림이 표시되지 않습니다 (5 루프라고 가정 해 보겠습니다).

그래서 메뉴 항목을 선택했지만 while 루프에서 건너 뛸 때 일종의 '자동 새로 고침'이 발생합니까?

자세한 내용. 이 잘 작동 (A '깨끗한'이미지를 제공합니다, 거기에 몇 가지 물건을 그립니다, 그것을 표시) :이, 그러나, 10 초 동안 '멀리 간다'다음 마지막 (즉, 5를 표시

// This brings in a 'clean' image 
writeableBitmap = new WriteableBitmap(CleanVegMap); 
image.Source = writeableBitmap; 
// This makes a bunch of draws on the bitmap 
DrawDinos2d(); 

) 이미지 :

int z = 0; 
while (z < 5){ 
z++; 
    // This brings in a 'clean' image 
    writeableBitmap = new WriteableBitmap(CleanVegMap); 
    image.Source = writeableBitmap; 
    // This makes a bunch of draws on the bitmap 
    DrawDinos2d(); 
} 

새로운 아이디어 : 어떻게 든 5 '그린'writeableBitmaps 어떻게 든 시스템에 의해, 메모리에 캐시되는 것이 가능하다?

   Dispatcher.Invoke((Action)delegate 
      {    
       writeableBitmap = new WriteableBitmap(CleanVegMap); 
       image.Source = writeableBitmap; 
       DrawDinos2d(); 
      }); 

같은 일이 (10 초 동안 사라집니다 다음 마지막 이미지를 표시

또 다른 단서가 :. 난 그냥에서 메시지 박스를 넣어

은 Dispatcher (아래와 같은)를 사용하여 시도 각 루프의 하단에 루프 어떻게 든 의심으로, 제대로 어떻게 든 다시 그려 화면을 '블리트'.

System.Windows.MessageBox.Show("Glarp!"); 

이 호출 시스템을 '일어나'다시, 어떤 아이디어를.?

+1

당신은 당신이 우리를 보여줄 수있는 코드가 있습니까? – PoweredByOrange

+0

코드의 톤이 난 그냥 몇 가지 (희망 추가 된 단편 – zetar

+0

을 게시합니다 ... 불행하게도, 나는 그것이 도움이 될 생각하지 않는다 ...있다 당신이 – zetar

답변

1

MessageBox를 처리에 삽입하고 MessageBox가 열린 상태에서 UI 스레드가 '캐치 업'할 수있는 가능성이 있다고 예상되는 결과가 나왔습니다. 그래서 MessageBox를 사용하여 갑자기 작동하게 만드는 '환상'을 만들었지 만 장면 뒤에서는 스레드를 정렬하고 명령 대기열을 지우는 스레드였습니다.

는이 같은 방법을 사용하여 비트 맵을 업데이트 할 수 있습니다, 프로그래밍 같은 효과를 만들려면 :이 스레드에서 비동기 작업을 실행

public void UpdateBitmap() 
    { 
     WriteableBitmap writeableBitmap = new WriteableBitmap 
           (100, 100, 96, 96, PixelFormats.Bgr32, null); 
     writeableBitmap.Dispatcher.InvokeAsync(() => 
      { 
       Console.WriteLine("work goes here"); 
      }); 
    } 

(ETA .NET 4.5 프레임 워크가 필요) 비트 맵의 ​​디스패처는 UI와 연결되어 추월 할 수있는 기회를 제공합니다. 'DrawDinos2d'메소드의 페이로드에 따라 MIGHT은 백그라운드 스레드로 처리를 마이그레이션하고이를 UI 스레드에 개별적으로 제공해야합니다. 그러나 먼저이 접근법부터 시작하십시오.

ETA는 : 닷넷 4.0 프레임 워크에서, 위의 상대는

public void UpdateBitmap() 
    { 
     object[] objs = new object[] {null}; 
     WriteableBitmap writeableBitmap = new WriteableBitmap(
      100, 100, 96, 96, PixelFormats.Bgr32, null); 
     writeableBitmap.Dispatcher.BeginInvoke((SendOrPostCallback)delegate 
      { 
       Console.WriteLine(@"work goes here"); 
      }, objs); 
    } 

워드 프로세서

는 스레드에서 지정된 인수로 지정된 대리자를 비동기식으로 실행 "읽기 ...이처럼 보이는 그 System.Windows.Threading.Dispatcher가 만들어졌습니다. "

+0

이 오류가 발생합니다. "오류 'System.Windows.Threading.Dispatcher'에 'InvokeAsync'에 대한 정의가없고 'System.Windows.Threading.Dispatcher'형식의 첫 번째 인수를 허용하는 확장 메서드 'InvokeAsync'가 없습니다. '을 찾을 수 있습니다 (using 지시문이나 어셈블리 참조가 누락 되었습니까?) "System.ServiceModel에 대한 참조를 추가했습니다. – zetar

+0

@zetar Aha! 프로젝트 속성으로 이동하여 '대상 프레임 워크'설정을 .NET Framework 4.5로 전환하고 알려주십시오. 비동기가 4.5에 추가되었으며 이전 버전에는 표시되지 않습니다. –

+0

Visual Studio 2010을 사용하고 있습니다. .NET Framework 4 만 있습니다. "Install other frameworks ..."를 클릭하면 여기로 이동합니다 : http://msdn.microsoft.com/en-US/vstudio /hh487282.aspx 및 다운로드 할 수있는 가장 높은 프레임 워크는 .NET 4.0.3입니다. 4.5는 어디에 있습니까? – zetar