WPF命令基础设施中是否有用于对话框的关闭命令?

4

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

3个回答

3
如果你只想绑定一个按钮点击事件来关闭对话框,你可以像文档中建议的那样,在按钮上设置IsCancel属性(链接)
<Button IsCancel="True">Cancel</Button>

当您单击时,它将使用false结果关闭对话框。如果您想要使用true结果关闭,一种非常简单的方法是添加一个单击处理程序并编写两行代码。您的XAML是:
<Button IsDefault="True" Click="acceptButton_Click">OK</Button>

而代码后台:

void acceptButton_Click(object sender, RoutedEventArgs e)
{
    this.DialogResult = true;
}

这将关闭对话框并返回一个“true”结果。 由于这是视图代码(关闭窗口),这个代码后台通常不会在我的严格MVVM架构中引起任何压力。YDMV。

3
这是WPF如何使用ApplicationCommand.Close的方法:
  1. WPF本身没有内置的ApplicationCommands.Close命令处理程序,但是
  2. 每当WPF收到带有lParam=APPCOMMAND_CLOSE的Win32消息WM_APPCOMMAND时,WPF就会执行ApplicationCommand.Close RoutedCommand。这意味着,如果任何Win32应用程序向您发送APPCOMMAND_CLOSE,则会调用您的ApplicationCommand.Close处理程序。
APPCOMMAND_CLOSE文档给出了以下定义:

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

我认为WPF应用程序应该以相同的方式处理ApplicationCommand.Close,并且“窗口”将包括对话框(在Win32世界中通常是这样)。
为什么您关心Win32文档中说的内容?这可能在以下三种情况下很重要:
  1. 可访问性方案
  2. 带有“关闭窗口”键的键盘
  3. 当用户配置了一组鼠标按钮以发送“关闭窗口”命令时

因此,回答您的问题:不,ApplicationCommand.Close并未保留用于关闭应用程序。它的目的是关闭窗口,包括对话框窗口。因此,没有必要创建单独的命令来关闭对话框。

许多应用程序只需在App.xaml中使用样式设置一个CommandBinding到Window类,并在处理程序中通过调用((Window)sender).Close()来结束。这是一个简单而优雅的解决方案。


1

关闭应用程序与关闭对话框是不同的。

有一个内置命令可以解除对话框。在您创建的任何Window类的顶部都有一个大红色的“X”。当您点击该“X”时,会生成一个“DialogCancelCommand”,然后由Window类中的“OnDialogCancel”事件处理程序处理。但是,由于某些原因,只有Redmond内部知道,“DialogCancelCommand”是一个内部RoutedEvent。 我不能代表其他工程师,但我已经从反射代码中复制了“DialogCancelCommand”,以便我可以像内部命令执行相同操作一样关闭对话框。

    /// <summary>
    /// Cancels a dialog.
    /// </summary>
    public static readonly RoutedCommand DialogCancelCommand = new RoutedCommand("DialogCancel", typeof(CoreCommands));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接