2009-06-13 12 views
25

WPF의 Window.ShowDialog 메서드는 nullable boolean을 반환합니다. CommonDialog.ShowDialog도 마찬가지입니다.ShowDialog()는 언제 null을 반환합니까?

이제는 false (사용자가 Cancel을 클릭하거나 Esc 키를 누름)가 true를 반환하는 경우를 이해합니다. 코드가 Window.DialogResult을 true로 설정했는데, 이는 OK 클릭에 대한 응답으로 나타납니다. 하지만 널?

제 생각에는 제목 표시 줄의 닫기 버튼을 클릭하면 null이 반환 될 수 있습니다. 그러나 docs 상태 (및 테스트하여 확인한)는 the title-bar Close button is treated as a Cancel입니다.

Window.ShowDialog 또는 CommonDialog.ShowDialog은 언제 null을 반환합니까?

+0

MS 설명서를 사랑해야합니다. "Nullable <(Of <(T>)>) 사용자가 창을 닫은 방법을 나타내는 Boolean 형식의 값입니다." 이런, 그게 도움이된다. –

+0

작가는 개발자에게 이야기하고 질문을 할 수는 없지만 화면에있는 것만 액세스 할 수있는 문서와 같은 소리입니다. – SqlRyan

답변

17

이 메서드는 항상 true 또는 false를 반환하며이 값은 항상 닫을 때의 DialogResult 속성과 같습니다.

그러나 DialogResult 속성은 창이 닫히기 전에 null이며 다른 스레드가 속성을 확인할 수 있습니다. 따라서 실제로는 null이 아니더라도 반환 값이 속성과 일치하는 nullable 부울 값이라는 점은 의미가 있습니다.

+0

다른 스레드가 DialogResult를 확인하십시오. 시도 할 경우 InvalidOperationException이 발생합니다 ("호출중인 스레드가 다른 스레드가 소유하고 있기 때문에이 개체에 액세스 할 수 없습니다.") –

+5

대화 상자의 이벤트 처리기에서 실행중인 다른 스레드는 다른 스레드는 아니지만 실행중인 DialogResult가 완료되기 전에. 개인적으로 나는 가난한 디자인 선택이라고 생각합니다. 그것은 nullable이 아니어야하고, 대화 상자가 종료되기 전에 getter가 접근하면 예외가 발생합니다. –

2

단추의 Click 이벤트에서 DialogResult = null을 반환하면 창이 열린 상태로 유지됩니다.

private void OkButton_Click(object sender, RoutedEventArgs e) 
{ 
    Button btn = sender as Button; 
    if (btn != null) 
    { 
     // forces all control to update... 
     btn.Focus(); 
    } 

    // TEST IF OK TO CLOSE 
    bool rc = _vm.ProcessOkCommand(); 
    if (rc) 
    { 
     DialogResult = true; 
    } 
    else 
    { 
     DialogResult = null; 
    } 
} 


<Button Content="OK" Name ="cmdOK" IsDefault="True" Click="OkButton_Click"/> 
+0

맞아, 그게 내 포인트 야. ShowDialog가 null을 돌려주지 않을 것 같아. –

+0

'DialogResult = null; '을 설정하는 것보다 아무 것도하지 않는 것이 낫습니다. 사실 둘 다 같아요. 틀 렸으면 고쳐줘. –

관련 문제