2010-04-13 3 views
0

두 메시지 상자가 차례로 있습니다. MessageBoxResult msgResult = MessageBox.Show로 희미한 msgResult ("메시지", "제목", MessageBoxButton.YesNo, MessageBoxImage.Question)WPF 새로 고침 후 vb.net에서 닫힌 메시지 상자

경우 mesgResult = MessageBoxresult.Yes은 다음 '일부 코드 ..... 메시지 박스 .Show ("또 다른 메시지", "제목", MessageBoxButton.OK, MessageBoxImage.Error)

종료 두 번째 메시지 상자가 사용자를 폐쇄됩니다

이 동일한 창에 남아있는 경우, 그리고 부분 메시지 상자의 제목 표시 줄은 Windows 텍스트 상자 바로 위에 계속 표시됩니다. 창문이 새로 고쳐지지 않은 것 같습니다. 어떻게 처리할까요? 감사합니다.

+0

Debug + Break All을 사용하여 호출 스택을 확인합니다. 일부 코드가 실행되어 창에 자체 페인팅을하지 못하게합니다. –

답변

1

이것은 일반적으로 순수 WPF 응용 프로그램에서는 발생하지 않습니다. 이 발생할 않는 경우 내가 본 상황은 다음과 같습니다

  1. 귀하의 UI 스레드
  2. 창 투명도 사용중인 비디오 드라이버의 버그가 일부 코드를 실행하는 동안 처리되지 메시지
  3. 를 실행 창 부분이 투명하고 비 WPF 응용 프로그램이 그림을 그릴 책임이 있습니다.
  4. WPF를 GDI (예 : MFC), GDI + (예 : WinForms) 또는 DirectX와 같은 비 WPF 기술과 통합하고 있습니다. 페인팅에 문제가있는 영역은 다른 기술로 페인트해야합니다. 여기에는 WPF 이외의 기술을 사용하는 Frame 및 MediaPlayer 컨트롤이 포함됩니다.

솔루션은 다릅니다

  • 경우 1 년에 보통 문제가 종종 분명하고 솔루션이 스레딩 문제를 해결하기 위해 보통의 경우 4. 스레딩 문제가 명확하지 않으면 Hans Passant가 제안한 디버거를 위반하면 데이터베이스 액세스와 같이 사용자가 인식하지 못한 장기 실행 작업이 나타날 수 있습니다.
  • 경우 2에서 일시적으로 소프트웨어 렌더링으로 전환하여 진단 할 수 있으며 비디오 드라이버를 업데이트하여 문제를 해결할 수 있습니다.
  • 다른 앱이 다시 칠하지 않으면 사용자가 할 수있는 일은 없지만 사용자는 소프트웨어에서 문제가 아닌 것으로 인식해야합니다.
  • 스레딩 문제가 명확하지 않은 경우 일반적으로 비 WPF 코드를 격리하고 메시지 처리 스레드가 활성 상태인지 확인하는 것이 좋습니다.

UI 스레드에서 장기 실행 작업을 실행하는 것은 일반적으로 좋지 않으므로 이러한 작업을 실행해야하는 경우 앱이 다중 스레드되어야합니다. 그러나 앱이 빠르거나 더러운 경우 또는 UI를 완전히 잠그면 OK입니다. 장기 실행 작업을 시작하기 전에 Dispatcher 큐가 완전히 플러시되었는지 확인하여 페인팅 문제를 해결할 수 있습니다. 이는 우선 순위가 낮은 빈 Dispatcher 호출을 실행하여 우선 순위가 높은 모든 조작이 먼저 실행되도록하여 수행됩니다. 예 :

Dispatcher.BeginInvoke(DispatcherPriority.ApplicationIdle, new Action(() => {})); 
관련 문제