为什么Dialogresult在WPF中是无效的布尔?
-
13-09-2019 - |
题
谁能想到对话的结果是WPF中的无效布尔的一个很好的解释?这总是让我感到困惑。在Winforms中,这是一种枚举类型,对我来说更有意义。
解决方案
我认为这是这样做的,因为在大多数情况下,您不需要 广义专业 诸如重试或忽略之类的选项。
如果您需要多于确定/取消,则应使用某种任务对话框,例如带有窃听答案。这样,您就不仅限于几十年前想到的几个枚举价值观,而且对拨号符只是对基本使用的正/负面/负面的,您可以实现自己的特定于高级需求的属性。因此,仅需要true/fals,而null表示窗口尚未关闭(尚未分配给该属性的值)。
如果您有一个对话框不仅仅是用户应回答的问题(例如,输入表格),通常使用OK/CANCAL更好,因此您不需要更多的值。
其他提示
这 DialogResult
属性在 Window
班级。不是全部 Window
S是对话。因此,该属性与所有窗口无关。一个 Window
通过 Show()
而不是 ShowDialog()
将(大概是,除非您因某种原因设置) DialogResult = null
.
这是一个简单的示例:
窗口1.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
, ,而非dialog有一个 null DialogResult
.
根据 MSDN文档:
显示对话框时,拨号符为无效,但既不接受也不取消。
但是,除非您要处理访问对话框的多个线程,否则我不确定如何发生这种情况。
文档说当以下事情之一发生时是错误的:
- PressAlt+F4。
- 点击关闭按钮。
- 从系统菜单中选择关闭。
Showdialog将始终返回True或False。 Dialogresult只有在打开对话框时才采取无效状态。从null过渡到True或Fals,将关闭对话框,并进行原始调用以showdialog返回。
IMO这是因为并不总是使用拨号。您会看到,只有通过其showdialog()方法调用窗口的窗口,如果您使用其show()方法调用它,然后尝试将dialogresult设置为任何东西,它将抛出invalidoperationException。因此,我认为这是可以无效的原因,如果您使用show()方法调用窗口,它将是无效的,如果您使用Showdialog()调用它,则取决于您。