모달 대화 상자 닫기에 ApplicationCommands.Close
을 사용해야합니까? 아니면 해당 명령을 응용 프로그램을 종료하기 위해 예약 된 것으로 간주합니까? 후자의 경우 사람들은 각 Dialog
상자에 대해 Close
명령을 만들거나 모든 모달 대화 상자에 대해 하나만 Close
명령을 만듭니다. 여기WPF 명령 인프라에 대화 상자에 대한 닫기 명령이 있습니까?
답변
은 WPF가 ApplicationCommand.Close를 사용하는 방법이다
가- WPF 자체
ApplicationCommands.Close
대한 명령어 핸들러에 내장 아니, - WPF 그것이
lParam=APPCOMMAND_CLOSE
와는 Win32 메시지를WM_APPCOMMAND
를 수신 할 때마다ApplicationCommand.Close
RoutedCommand을 수행하지 않았다. 즉, Win32 응용 프로그램에서APPCOMMAND_CLOSE
을 전송하면ApplicationCommand.Close
처리기가 호출됩니다.창을 닫습니다 (안 응용 프로그램) :
APPCOMMAND_CLOSE
의 documentation
이 정의를 제공합니다.
(그것은 일반적으로 Win32에서의 세계에서와) 나는 WPF 응용 프로그램 ApplicationCommand.Close
같은 방식으로 처리해야 가정 것이고, "창은"대화 상자를 포함하는 것이다.
왜 Win32 설명서의 내용에 신경 써야합니까? 그것은 세 가지 상황에서 중요 할 수 있습니다
- Accessibilty 시나리오 사용자가 마우스 버튼의 조합이 "창 닫기"를 보내도록 구성되면
- 키 "창 닫기"명령 이
- 키보드
그래서 귀하의 질문에 대답 : 아니, ApplicationCommand.Close
이 응용 프로그램을 닫기 위해 예약 하지입니다. 그 목적은 대화 상자 창을 포함하여 창을 닫는 것입니다. 따라서 별도의 명령을 만들어 대화 상자를 닫을 필요가 없습니다.
많은 응용 프로그램은 App.xaml의 스타일을 사용하여 thw Window 클래스에서 CommandBinding을 설정하고 핸들러에서는 ((Window)sender).Close()
을 호출하여 끝납니다. 이것은 간단하고 우아한 솔루션입니다.
응용 프로그램 닫기는 대화 상자를 닫는 것과 다릅니다.
대화 상자를 닫는 명령이 내장되어 있습니다. 생성하는 모든 Window 클래스의 맨 위에 큰 빨간색 'X'가 있습니다. 'X'를 누르면 'DialogCancelCommand'가 생성되고,이 클래스는 Window 클래스의 'OnDialogCancel'이벤트 핸들러에 의해 처리됩니다. 그러나 Redmond 내부에서만 알려진 이유 때문에 'DialogCancelCommand'는 내부 RoutedEvent입니다. 다른 엔지니어와 이야기 할 수는 없지만 Reflected 코드에서 'DialogCancelCommand'를 재현하여 내부 명령이 동일한 작업을 수행하는 방식과 동일한 대화 상자를 닫을 수 있습니다.당신이 그것을 클릭하면
<Button IsCancel="True">Cancel</Button>
, 그것은을 닫습니다 : 당신은 단지 대화 상자를 닫습니다 버튼 클릭을 결합하고자하는 경우
/// <summary>
/// Cancels a dialog.
/// </summary>
public static readonly RoutedCommand DialogCancelCommand = new RoutedCommand("DialogCancel", typeof(CoreCommands));
, 당신은 버튼을 as recommended in the docs에 IsCancel
속성을 설정할 수 있습니다 대화 상자에 false
결과가 표시됩니다. true
결과로 닫으려면 클릭 핸들러를 추가하고 두 줄의 코드 숨김을 작성하는 것이 가장 간단한 방법입니다. 귀하의 XAML은 다음과 같습니다
<Button IsDefault="True" Click="acceptButton_Click">OK</Button>
그리고 숨김 코드 :
void acceptButton_Click(object sender, RoutedEventArgs e)
{
this.DialogResult = true;
}
이 는 대화 상자를 닫고 true
결과를 반환합니다.
이 코드는보기 코드이므로 (윈도우 닫기)이 코드 숨김은 일반적으로 엄격한 MVVM 아키텍처에서 저의 어떤 강박감을 유발하지 않습니다. YDMV.