WPF标准命令 - 哪里退出?

时间:2009-08-17 08:02:58

标签: wpf binding

我正在WPF应用程序中创建一个标准菜单。

我知道我可以创建自定义命令,但我知道还有一堆标准命令要绑定。

例如,要打开一个文件,我应该绑定到 ApplicationCommands.Open ,以关闭我应该绑定到 ApplicationCommands.Close 的文件。还有大量 EditCommands ComponentCommands NavigationCommands

似乎没有“退出”命令。我原以为 ApplicationCommands.Exit

我应该将什么绑定到“退出”菜单项?要为某些东西创建自定义命令,这个通用似乎是错误的。

7 个答案:

答案 0 :(得分:8)

不幸的是,没有预定义的ApplicationCommands.Exit。在2008年的Microsoft Connect上建议在WPF中添加一个:http://connect.microsoft.com/VisualStudio/feedback/details/354300/add-predefined-wpf-command-applicationcommands-exit。但是,该项目已被标记为已关闭/延期。

Mike Taulty在他的博客文章中讨论了如何create your own Exit command

答案 1 :(得分:7)

实际上并不复杂(但是,M $因为没有提供它而感到很糟糕)。你走了:

public static class MyCommands
{
    private static readonly ICommand appCloseCmd = new ApplicationCloseCommand();
    public static ICommand ApplicationCloseCommand
    {
        get { return appCloseCmd; }
    }
}

//===================================================================================================
public class ApplicationCloseCommand : ICommand
{
    public event EventHandler CanExecuteChanged
    {
        // You may not need a body here at all...
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }

    public bool CanExecute(object parameter)
    {
        return Application.Current != null && Application.Current.MainWindow != null;
    }

    public void Execute(object parameter)
    {
        Application.Current.MainWindow.Close();
    }
}

甚至可能不需要AplicationCloseCommand.CanExecuteChanged事件处理程序的主体。

你这样使用它:

<MenuItem Header="{DynamicResource MenuFileExit}" Command="MyNamespace:MyCommands.ApplicationCloseCommand"/>

干杯!

(你无法想象我自己发现这个命令的时间有多长了......)

答案 2 :(得分:4)

AFAIK没有ApplicationCommands.Quit或ApplicationCommands.Exit,所以我想你必须自己创建它......

无论如何,如果你使用MVVM pattern,RoutedCommands不是很方便,所以最好使用像RelayCommandDelegateCommand这样的轻量级替代品。

答案 3 :(得分:2)

是的,对于Microsoft在其预定义命令集合中包含ApplicationCommands.Exit命令是很有意义的。他们没有让我感到失望。但是,正如对这个问题的答案所证实的那样,并不是所有的一切都消失了。

由于缺少适当的ApplicationCommands.Exit对象,有许多变通办法。但是,我最不明白这一点。他们要么在视图模型中实现某些东西,要么实际上是一种严格的视图行为(在某些情况下使用Application.Current.MainWindow进入视图对象图!),或者他们编写一堆代码以完成某些工作XAML的性能很好,也更方便。

恕我直言,最简单的方法是为窗口声明RoutedUICommand资源,将其附加到命令绑定和菜单项上,以将所有部分连接起来。例如:

<Window x:Class="ConwaysGameOfLife.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">

  <Window.Resources>
    <RoutedUICommand x:Key="fileExitCommand" Text="File E_xit">
      <RoutedUICommand.InputGestures>
        <KeyGesture >Alt+F4</KeyGesture>
      </RoutedUICommand.InputGestures>
    </RoutedUICommand>
  </Window.Resources>

  <Window.CommandBindings>
    <CommandBinding Command="{StaticResource fileExitCommand}" Executed="fileExitCommand_Executed"/>
  </Window.CommandBindings>

  <DockPanel>
    <Menu DockPanel.Dock="Top">
      <MenuItem Header="_File">
        <!-- other menu items go here -->
        <Separator/>
        <MenuItem Command="{StaticResource fileExitCommand}"/>
      </MenuItem>
    </Menu>
    <!-- the main client area UI goes here -->
  </DockPanel>

</Window>

用于命令绑定的Executed事件处理程序很简单:

private void fileExitCommand_Executed(object sender, ExecutedRoutedEventArgs e)
{
    Close();
}

当然,假设您的程序实现遵循关闭主窗口以退出程序的通常语义。

通过这种方式,所有特定于UI的元素都直接进入RoutedUICommand对象,该对象可以在XAML中正确且方便地进行配置,而不必声明新的C#类来实现命令和/或从背后隐藏代码的输入绑定。 MenuItem对象已经知道如何使用RoutedUICommand进行显示,因此采用这种方法可以很好地将命令的属性与UI的其余部分解耦。如果您希望使用默认的 Alt + F4 以外的其他内容(例如 Ctrl + W ),它还提供了一种方便的方式来提供辅助按键手势。 >

您甚至可以将RoutedUICommand声明放入App.xaml文件中,以便在程序中的多个窗口(如果它们存在)之间重用。同样,将资源中声明的特定于UI的方面与整个程序中使用的使用者分离。

与我所看到的其他选项(在这里和其他地方)相比,我发现这种方法更加通用和易于实施。

答案 4 :(得分:1)

private void MenuItem_Click(object sender, RoutedEventArgs e)
    {
        Application.Current.Shutdown();
    }

答案 5 :(得分:0)

在将命令绑定到窗口中之前,可以修改命令的Text属性。这将更改命令的文本,无论它出现在您的ui中。

编辑:执行此操作以关闭窗口或应用程序

答案 6 :(得分:0)

非常简单:

using System.Windows.Input;

namespace YourApp
{
    static class ApplicationCommands
    {    
        public static RoutedCommand Quit { get; }    

        static ApplicationCommands()
        {
            var inputGestures = new InputGestureCollection();
            inputGestures.Add(new KeyGesture(Key.Q, ModifierKeys.Control));
            Quit = new RoutedUICommand("Quit", "Quit", typeof(ApplicationCommands),
                inputGestures);
        }
    }
}

像这样在您的XAML中使用它:

<Window.CommandBindings>
    <CommandBinding Command="local:ApplicationCommands.Quit" 
                    Executed="QuitCommandOnExecuted"/>
</Window.CommandBindings>

[..]

<MenuItem Command="local:ApplicationCommands.Quit" />

隐藏代码:

void QuitCommandOnExecuted(object sender, ExecutedRoutedEventArgs e)
{
    Application.Current.Shutdown();
}