WPF命令基础结构中的对话框是否有关闭命令?

时间:2010-06-21 22:08:24

标签: wpf modal-dialog command

我应该使用ApplicationCommands.Close来关闭模式对话框,还是该命令被认为是为关闭应用程序而保留的?如果是后者,那么大家会为每个Close框创建Dialog命令,还是为所有模态对话框创建一个Close命令?

3 个答案:

答案 0 :(得分:3)

以下是WPF如何使用ApplicationCommand.Close:

  1. WPF本身没有ApplicationCommands.Close的内置命令处理程序,但是
  2. 只要WPF收到带ApplicationCommand.Close的Win32消息WM_APPCOMMAND,WPF就会执行lParam=APPCOMMAND_CLOSE RoutedCommand。这意味着如果任何Win32应用程序向您发送APPCOMMAND_CLOSE,您的ApplicationCommand.Close处理程序将被调用。
  3. APPCOMMAND_CLOSE的{​​{3}}给出了这个定义:

      

    关闭窗口(不是应用程序)。

    我认为WPF应用程序应该以相同的方式处理ApplicationCommand.Close,并且“窗口”将包含对话框(它通常在Win32的世界中)。

    为什么你关心Win32文档的内容?在三种情况下这可能很重要:

    1. Accessibilty情景
    2. 具有“关闭窗口”键的键盘
    3. 当用户配置鼠标按钮组合以发送“关闭窗口”命令时
    4. 所以回答你的问题:不,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));