2010-06-21 1 views
3

모달 대화 상자 닫기에 ApplicationCommands.Close을 사용해야합니까? 아니면 해당 명령을 응용 프로그램을 종료하기 위해 예약 된 것으로 간주합니까? 후자의 경우 사람들은 각 Dialog 상자에 대해 Close 명령을 만들거나 모든 모달 대화 상자에 대해 하나만 Close 명령을 만듭니다. 여기WPF 명령 인프라에 대화 상자에 대한 닫기 명령이 있습니까?

답변

2

은 WPF가 ApplicationCommand.Close를 사용하는 방법이다

  1. WPF 자체 ApplicationCommands.Close 대한 명령어 핸들러에 내장 아니,
  2. WPF 그것이 lParam=APPCOMMAND_CLOSE와는 Win32 메시지를 WM_APPCOMMAND를 수신 할 때마다 ApplicationCommand.Close RoutedCommand을 수행하지 않았다. 즉, Win32 응용 프로그램에서 APPCOMMAND_CLOSE을 전송하면 ApplicationCommand.Close 처리기가 호출됩니다.

    창을 닫습니다 (안 응용 프로그램) : APPCOMMAND_CLOSEdocumentation

이 정의를 제공합니다.

(그것은 일반적으로 Win32에서의 세계에서와) 나는 WPF 응용 프로그램 ApplicationCommand.Close 같은 방식으로 처리해야 가정 것이고, "창은"대화 상자를 포함하는 것이다.

왜 Win32 설명서의 내용에 신경 써야합니까? 그것은 세 가지 상황에서 중요 할 수 있습니다

  1. Accessibilty 시나리오
  2. 사용자가 마우스 버튼의 조합이 "창 닫기"를 보내도록 구성되면
  3. 키 "창 닫기"명령
  4. 키보드

그래서 귀하의 질문에 대답 : 아니, ApplicationCommand.Close이 응용 프로그램을 닫기 위해 예약 하지입니다. 그 목적은 대화 상자 창을 포함하여 창을 닫는 것입니다. 따라서 별도의 명령을 만들어 대화 상자를 닫을 필요가 없습니다.

많은 응용 프로그램은 App.xaml의 스타일을 사용하여 thw Window 클래스에서 CommandBinding을 설정하고 핸들러에서는 ((Window)sender).Close()을 호출하여 끝납니다. 이것은 간단하고 우아한 솔루션입니다.

1

응용 프로그램 닫기는 대화 상자를 닫는 것과 다릅니다.

대화 상자를 닫는 명령이 내장되어 있습니다. 생성하는 모든 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)); 
2

, 당신은 버튼을 as recommended in the docsIsCancel 속성을 설정할 수 있습니다 대화 상자에 false 결과가 표시됩니다. true 결과로 닫으려면 클릭 핸들러를 추가하고 두 줄의 코드 숨김을 작성하는 것이 가장 간단한 방법입니다. 귀하의 XAML은 다음과 같습니다

<Button IsDefault="True" Click="acceptButton_Click">OK</Button> 

그리고 숨김 코드 :

void acceptButton_Click(object sender, RoutedEventArgs e) 
{ 
    this.DialogResult = true; 
} 

대화 상자를 닫고 true 결과를 반환합니다.

이 코드는보기 코드이므로 (윈도우 닫기)이 코드 숨김은 일반적으로 엄격한 MVVM 아키텍처에서 저의 어떤 강박감을 유발하지 않습니다. YDMV.