DB에서 데이터를로드하고, 시뮬레이션을 계산하고, 경로를 최적화하는 등의 많은 장기 실행 작업을 처리해야하는 C# 4.0의 WPF 데스크톱 응용 프로그램을 개발하고 있습니다.WPF Please Wait Dialog
이러한 장기 실행 작업이 백그라운드에서 실행될 때 잠시 기다려주십시오. 대화 상자를 표시하고 싶습니다. Please-Wait 대화 상자가 표시되면 응용 프로그램을 잠글 수 있지만 응용 프로그램 창을 비활성화하는 것은 좋지 않습니다. 모든 DataGrid의 상태 (SelectedItem
)가 손실 될 수 있기 때문입니다.
내가 지금까지 사용해 왔지만 몇 가지 문제가 있습니다 : Create-factory 메소드를 사용하여 새로운 WaitXUI가 생성되었습니다. Create 메서드는 캡션 텍스트와 잠글 수있는 호스트 컨트롤에 대한 참조를 필요로합니다. 작성 방법은 윈도우의 StartupLocation을 설정, 캡션 텍스트 및 호스트가 고정하려면 : WaitXUI 다음 표시 할 수있는 과부하 ShowDialog 메서드와
WaitXUI wait = WaitXUI.Create("Simulation running...", this);
wait.ShowDialog(new Action(() =>
{
// long running operation
}));
합니다. ShowDialog 과부하는 장기 실행 작업을 래핑하는 Action을 기대합니다.
ShowDialog 오버로드에서 자체 스레드에서 동작을 시작한 다음 호스트 컨트롤을 비활성화 (불투명도를 0.5로 설정하고 IsEnabled를 false로 설정)하고 기본 클래스의 ShowDialog를 호출합니다. 여기
public bool? ShowDialog(Action action)
{
bool? result = true;
// start a new thread to start the submitted action
Thread t = new Thread(new ThreadStart(delegate()
{
// start the submitted action
try
{
Dispatcher.UnhandledException += Dispatcher_UnhandledException;
Dispatcher.Invoke(DispatcherPriority.Normal, action);
}
catch (Exception ex)
{
throw ex;
}
finally
{
// close the window
Dispatcher.UnhandledException -= Dispatcher_UnhandledException;
this.DoClose();
}
}));
t.Start();
if (t.ThreadState != ThreadState.Stopped)
{
result = this.ShowDialog();
}
return result;
}
private new bool? ShowDialog()
{
DisableHost();
this.Topmost = true;
return base.ShowDialog();
}
private void DisableHost()
{
if (host != null)
{
host.Dispatcher.Invoke(new Action(delegate()
{
this.Width = host.Width - 20;
host.Cursor = Cursors.Wait;
host.IsEnabled = false;
host.Opacity = 0.5;
}));
}
}
는이 문제입니다 :
- 때 스레드가 WaitXUI가 표시된 후 몇 ms 끝납니다.
- 스레드가 여전히 실행 중이지만 대화 상자가 나타나지 않는 경우가 있습니다.
이것은 현재 내 마음에 떠오르는 주요 문제입니다. 이 개념을 어떻게 개선 할 수 있습니까? 아니면이 문제를 해결하기 위해 어떤 다른 방법을 사용할 수 있습니까?
미리 감사드립니다.
못생긴만큼 게시하지 않으려합니다. 모든 컨트롤을 IsEnabled = false로 설정하십시오. 또는 Window에서 입력을 캡처하고 e.handled = true로 설정하십시오. – Paparazzi
이것은 확실히 중복입니다. – UIlrvnd
http://stackoverflow.com/questions/3480966/display-hourglass-when-application-is-busy – Jimmy