나는 눈에 보이게하고 싶은 직사각형을 가지고있다. 그런 다음 나는 500 밀리 초를 기다리고 싶다. 그런 다음 그것을 다시 보이지 않게 만들고 싶다. 사각형의 어떤 종류를 변경하지 않고 0.5 초에 일시 정지했다 BackgroundWorker를 사용하여 WPF UI 요소를 표시하거나 숨기는 방법?
MuzzleFlash.Visibility = Visibility.Visible;
Thread.Sleep(500);
this.UpdateLayout();
this.InvalidateVisual();
MuzzleFlash.Visibility = Visibility.Collapsed;
나는 그들이 가정으로 업데이트 할 창을 강제로 두 중간 선을했지만,이 모든했다 :
처음에 나는이 코드를 시도했다.
그래서 BackgroundWorkers에 대해 들었고, 어떻게 사용해야하는지 알아 보았습니다. 잠깐 읽고 나면 이걸 생각해 냈습니다. 그 촬영이 이전에 근무 캔버스에 MouseDown 이벤트,에 가입 참고 :
private void Shoot(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
BackgroundWorker UIUpdater = new BackgroundWorker();
UIUpdater.WorkerSupportsCancellation = true;
UIUpdater.WorkerReportsProgress = false;
UIUpdater.DoWork += new DoWorkEventHandler(UI_DoWork);
UIUpdater.RunWorkerCompleted += new RunWorkerCompletedEventHandler(cancelUIUpdate);
}
private void UI_DoWork(object sender, DoWorkEventArgs e)
{
MuzzleFlash.Visibility = Visibility.Visible;
Thread.Sleep(500);
this.UpdateLayout();
this.InvalidateVisual();
MuzzleFlash.Visibility = Visibility.Collapsed;
}
private void cancelUIUpdate(object sender, RunWorkerCompletedEventArgs e)
{
BackgroundWorker bw = sender as BackgroundWorker;
bw.CancelAsync();
}
는 이제 심지어 노동자가 아무것도하지 않는 나에게 지시, 0.5 초 일시 정지하지 않습니다. 이 문제를 어떻게 해결하고 사각형을 표시하거나 사라지게 할 수 있습니까?
타이머를 사용합니다. 너는 정말로 일을하고 있지 않다. – Paparazzi
작업자 스레드에서 모든 작업을 수행하기 때문에 작동하지 않습니다. 기본 UI 스레드는 다음과 같이 말합니다. "백그라운드 작업자 시작 후 종료"* bg worker는 "시각적 플래그를 설정하고 잠시 기다렸다가 가시 플래그를 false로 설정 한 다음 UI 스레드로 다시 돌아가 UI를 업데이트 할 수 있습니다."라고 말합니다. bg 스레드는 디스플레이를 업데이트하기 위해 주 UI 스레드로 다시 알림을 보내지 않습니다. 이런 식으로하고 싶다면 WPF의 Dispatcher를 살펴 보는 것이 좋습니다. 비슷한 예제를 사용하는 간단한 요약은 [이 대답] (http://stackoverflow.com/a/15930792/302677)을 참고하십시오. – Rachel
간단한 "해결책"은'MuzzleFlash.Visibility = Visibility.Visible' 라인을 메인 UI 스레드로 옮겨서'Shoot (...) '메소드 내에서 실행하는 것입니다. 그런 다음 bg worker가 ""잠시 기다렸다가 가시 플래그를 false로 설정 한 다음 다시 UI 스레드로 끝내서 업데이트 할 수 있습니다. "라고 말하면서 코드는 *"보이는 플래그를 true로 설정하고 bg 작업자를 시작한 다음 디스플레이를 끝내고 " .또한 WPF는 일반적으로 생성되지 않은 스레드의 객체를 업데이트하지 않으므로 RunWorkerCompleted에 * "visible visible flag false"* 비트를 넣을 수 있으므로 bg에서 업데이트하려고하는 예외를 얻을 수 있습니다 노동자. – Rachel