Dialogresult가 WPF에서 무효가되는 부울 인 이유는 무엇입니까?
-
13-09-2019 - |
문제
대화 상자의 결과가 WPF에서 무효가 될 수 있다는 사실에 대한 좋은 설명을 생각할 수 있습니까? 이것은 항상 나를 당황하게 만들었습니다. Winforms에서 그것은 열거적인 유형이었고 그것은 나에게 훨씬 더 의미가있었습니다.
해결책
내 생각에 이것은 대부분의 경우 필요하지 않기 때문에 일반화 된 전문 재 시도 또는 무시와 같은 옵션.
OK/취소 이상이 필요한 경우, 예를 들어 서면 답변과 함께 어떤 종류의 작업 대화 상자를 사용해야합니다. 이렇게하면 수십 년 전에 누군가가 생각한 몇 안되는 열거 가치에 국한되지 않으며, Dialogresult는 기본 사용에 긍정적/부정적이며 고급 요구에 특정한 자산을 구현할 수 있습니다. 따라서 True/False 만 필요하며 NULL은 창이 아직 닫히지 않았 음을 나타냅니다 (아직 값은 속성에 할당되지 않았습니다).
사용자가 대답 해야하는 질문 (예 : 항목 양식) 이상의 대화가있는 경우 일반적으로 OK/CANCEL을 사용하는 것이 좋으므로 더 많은 값이 필요하지 않습니다.
다른 팁
그만큼 DialogResult
속성은 Window
수업. 전부는 아닙니다 Window
S는 대화입니다. 따라서 속성이 모든 창과 관련이있는 것은 아닙니다. ㅏ Window
그것은 그것을 통해 보여졌습니다 Show()
보다는 ShowDialog()
Will (아마도 어떤 이유로 든 설정하지 않는 한) DialogResult = null
.
다음은 간단한 예를 보여줍니다.
Window1.xaml:
<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<StackPanel>
<Button Name="b1">Show</Button>
<Button Name="b2">ShowDialog</Button>
</StackPanel>
</Window>
Window1.xaml.cs:
using System.Windows;
namespace WpfApplication1
{
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
b1.Click += new RoutedEventHandler(b1_Click);
b2.Click += new RoutedEventHandler(b2_Click);
}
void b1_Click(object sender, RoutedEventArgs e)
{
var w = new Window();
w.Closed += delegate
{
MessageBox.Show("" + w.DialogResult);
};
w.Show();
}
void b2_Click(object sender, RoutedEventArgs e)
{
var w = new Window();
w.ShowDialog();
MessageBox.Show("" + w.DialogResult);
}
}
}
창을 닫으면 대화 상자에 DialogResult
의 false
, 비 디 알로그에는 a null DialogResult
.
에 따르면 MSDN 문서:
대화 상자가 표시되면 수락되거나 취소되지 않으면 Dialogresult가 NULL입니다.
그러나 대화 상자에 액세스하는 여러 스레드를 다루지 않으면 어떻게 될 수 있는지 잘 모르겠습니다.
문서는 다음과 같은 일 중 하나가 발생하면 거짓이라고 말합니다.
- 프레스 살트+F4.
- 닫기 버튼을 클릭합니다.
- 시스템 메뉴에서 닫기를 선택합니다.
showdialog는 항상 참 또는 거짓을 반환합니다. Dialogresult는 대화 상자가 열릴 때만 Null 상태 만 가져갑니다. null에서 true 또는 false로 전환하면 대화 상자가 닫히고 원래 호출을 showdialog 반환합니다.
IMO 이것은 DialOgresult가 항상 사용되지 않기 때문입니다. Showdialog () 메소드에 의해 창을 호출하는 경우에만 Dialogresult를 설정할 수 있습니다. Show () 메소드로 호출하고 DialOgresult를 무엇이든 설정하려고하면 유효한 정보를 제공합니다. 그래서 그것이 그것이 무효가 될 수있는 이유라고 생각합니다. show () 메소드가있는 창을 호출 할 경우 showdialog ()를 사용하여 호출하면 널이됩니다.