我应该使用ApplicationCommands.Close
来关闭模式对话框,还是该命令被认为是为关闭应用程序而保留的?如果是后者,那么大家会为每个Close
框创建Dialog
命令,还是为所有模态对话框创建一个Close
命令?
答案 0 :(得分:3)
以下是WPF如何使用ApplicationCommand.Close:
ApplicationCommands.Close
的内置命令处理程序,但是ApplicationCommand.Close
的Win32消息WM_APPCOMMAND
,WPF就会执行lParam=APPCOMMAND_CLOSE
RoutedCommand。这意味着如果任何Win32应用程序向您发送APPCOMMAND_CLOSE
,您的ApplicationCommand.Close
处理程序将被调用。 APPCOMMAND_CLOSE
的{{3}}给出了这个定义:
关闭窗口(不是应用程序)。
我认为WPF应用程序应该以相同的方式处理ApplicationCommand.Close
,并且“窗口”将包含对话框(它通常在Win32的世界中)。
为什么你关心Win32文档的内容?在三种情况下这可能很重要:
所以回答你的问题:不,ApplicationCommand.Close
不保留用于关闭应用程序。其目的是关闭窗口,包括一个对话框窗口。因此,无需创建单独的命令来关闭对话框。
许多应用程序只是使用App.xaml中的样式在Window类上设置CommandBinding,而在处理程序中它们通过调用((Window)sender).Close()
来结束。这是一个简单而优雅的解决方案。
答案 1 :(得分:3)
如果您只是想要绑定按钮,请单击以关闭对话框,您可以在按钮as recommended in the docs上设置IsCancel
属性:
<Button IsCancel="True">Cancel</Button>
单击该按钮时,将关闭带有false
结果的对话框。如果要使用true
结果关闭,一种非常简单的方法是添加单击处理程序并编写两(2)行代码隐藏。你的XAML是:
<Button IsDefault="True" Click="acceptButton_Click">OK</Button>
代码隐藏:
void acceptButton_Click(object sender, RoutedEventArgs e)
{
this.DialogResult = true;
}
此将关闭对话框并返回true
结果。
由于这是视图代码(关闭窗口),因此这个代码隐藏通常不会导致我在严格的MVVM架构中受到任何胁迫。 YDMV。
答案 2 :(得分:1)
关闭应用程序与关闭对话框不同。
有一个用于解除对话框的内置命令。您创建的任何Window类的顶部都有一个大的红色“X”。当你点击'X'时你会生成一个'DialogCancelCommand',然后由Window类中的'OnDialogCancel'事件处理程序处理。但是,由于只有Redmond内部知道的原因,'DialogCancelCommand'是一个内部RoutedEvent。 我不能代表其他工程师,但我已经从Reflected代码中复制了'DialogCancelCommand',这样我就可以关闭对话框,与内部命令执行相同操作的方式相同。
/// <summary>
/// Cancels a dialog.
/// </summary>
public static readonly RoutedCommand DialogCancelCommand = new RoutedCommand("DialogCancel", typeof(CoreCommands));