는 [나는 Catel 태그,하지만 난이 질문은 어떤 MVVM 프레임 워크에 적용되는 것 같아요.]WPF MVVM은 - 창 닫기 이벤트 디스플레이 메시지 박스는
특히에서 (닫기 이벤트를 처리하기위한이 웹 사이트에 대한 몇 가지 제안이 있습니다 프로그래머가 앱을 닫을 수 있는지 확인하거나 "Are you sure?"를 확인하기 위해 "빨간색 X"버튼을 누릅니다. 대화 상자. 저는 세 가지를 시도했습니다 -보기에서 이벤트를 완전히 처리하고 이벤트 트리거를 사용하여 XAML에서 ViewModel에 대한 명령을 호출하고 View에서 ViewModel 이벤트 처리기에 이벤트 처리를 연결하게했습니다. 사용자가 예상대로 창 닫기를 시도 할 때 세 가지 방법 모두 트리거됩니다. 그래서,
System.InvalidOperationException was unhandled
Message: An unhandled exception of type 'System.InvalidOperationException' occurred in PresentationFramework.dll
Additional information: Cannot set Visibility to Visible or call Show, ShowDialog, Close, or WindowInteropHelper.EnsureHandle while a Window is closing.
내 메인 창을 닫는 창 :
내 문제는 내가 사용자의 확인을 얻을 수있는 이벤트 처리기에서 메시지 박스를 표시하려고하면, 나는 다음과 같은 예외를 얻을 수 있다는 것입니다 그것이 닫히면 내 애플 리케이션도 마찬가지다. CancelEventArgs.Cancel 값을 true로 설정하여 창 닫기를 취소 할 수 있다는 것을 알고 있습니다.
어떻게 닫히는 이벤트를 트래핑 한 다음 내 핸들러에서 사용자의 입력에 따라 실제로 닫을 지 여부를 결정하도록 할 수 있습니까?
자세한 정보가 필요하면 알려 주시기 바랍니다. 감사!
편집 : 여기가 종료 응용 프로그램 메뉴 명령을 처리하기 위해 사용하고있는 작업은 다음과 같습니다
private async void OnExitApplicationExecute()
if (this.IsProcessing)
{
await this._messageService.ShowWarningAsync("Please click on 'Stop Processing' before closing the Processor.", "Stop Processing First");
}
else
{
MessageResult msgResult = await this._messageService.ShowAsync("Exiting the Processor will halt all request processing." + Environment.NewLine + "Are you sure?",
"Exiting Processor...", MessageButton.YesNo, MessageImage.Question);
if (msgResult == MessageResult.Yes)
{
_logger.Info("Main Task: Application ended.");
this._navigationService.CloseApplication();
}
}
}
중에서 MessageService 및 navigationService 통화 Catel 서비스/방법이 있습니다. 로거는 NLog입니다.
이 기능은 모든 검사가 완료 될 때까지 창이 닫히지 않기 때문에 명령 처리기로 실행될 때 작동합니다. Closing 이벤트 처리의 일부로이 동일한 로직을 주입하려고하면 위에서 언급 한 예외가 발생합니다.
여기 스택 트레이스의 일부 : 나는 내 응용 프로그램/윈도우 개폐 과정을 관리 할 경우, 기본적으로
2017-11-01 14:45:57.3269 [00009] ERROR App: An unhandled exception occurred and has been logged. Please contact support. System.InvalidOperationException: Cannot set Visibility to Visible or call Show, ShowDialog, Close, or WindowInteropHelper.EnsureHandle while a Window is closing.
at System.Windows.Window.VerifyNotClosing()
at System.Windows.Window.InternalClose(Boolean shutdown, Boolean ignoreCancel)
at System.Windows.Window.Close()
at Catel.Windows.DataWindow.SetDialogResultAndMakeSureWindowGetsClosed(Nullable`1 result) in C:\CI_WS\Ws\105284\Source\Catel\src\Catel.MVVM\Catel.MVVM.Shared\Windows\Windows\DataWindow\DataWindow.cs:line 708
at Catel.Windows.DataWindow.<OnDataWindowClosing>b__104_0() in C:\CI_WS\Ws\105284\Source\Catel\src\Catel.MVVM\Catel.MVVM.Shared\Windows\Windows\DataWindow\DataWindow.cs:line 892
at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
저는 종종 WPF의 주 창 WindowClosing 이벤트 처리기의 창에서 MessageBox 또는 ShowDialog를 호출합니다. 나는이 문제가 없었다. Windows, .NET 등의 버전은 무엇입니까? 그것을 재생산하는 최소한의 코드 샘플을 게시 할 수 있습니까? –
이것을 재현 할 수 없습니다. 방금 WPF 응용 프로그램을 새로 만들었고'MessageBox.Show ("This is a test");를'MainWindow'의'Closing' 이벤트 처리기에 추가했습니다. 메시지 상자가 나타나고 오류는 없습니다. –
더욱 복잡한 대화 상자에서 사용자에게 창을 정말로 닫으려고하는지 물어보고 닫기를 취소하면 오류가 없습니다. 우리는 여러분의 코드를 볼 필요가 있습니다. –