SystemCommands。[SomeWindowAction]命令之外:

时间:2013-12-16 00:29:32

标签: wpf .net-4.5

为什么在绑定到相关系统命令的命令绑定的处理程序之外调用SystemCommands.MaximizeWindow(this)不起作用?

为什么这些SystemCommands方法甚至存在?似乎所有这些功能都可以通过窗口本身来完成。

1 个答案:

答案 0 :(得分:0)

修改

在.NET 4.5中引入了SystemCommands的静态方法,作为常见窗口操作的首选方法。 在引擎盖下,它们使用非阻塞PostMessage函数实现,而不是阻塞SendMessage(window.Close())或ShowWindow函数(window.WindowState)。

即使在命令绑定处理程序之外它们也应该正常工作(如果显示了窗口):

<Window x:Class="WpfApplication.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <StackPanel VerticalAlignment="Center" Orientation="Horizontal">
        <Button Content="close" Name="CloseButton" Click="CloseButton_Click" />
        <Button Content="maximize" Name="MaximizeButton" Click="MaximizeButton_Click" />
        <Button Content="restore" Name="RestoreButton" Click="RestoreButton_Click" />
        <Button Content="minimize" Name="MinimizeButton" Click="MinimizeButton_Click" />
    </StackPanel>
</Window>
public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
        private void CloseButton_Click(object sender, RoutedEventArgs e)
        {
            SystemCommands.CloseWindow(this);
        }
        private void MaximizeButton_Click(object sender, RoutedEventArgs e)
        {
            SystemCommands.MaximizeWindow(this);
        }
        private void RestoreButton_Click(object sender, RoutedEventArgs e)
        {
            SystemCommands.RestoreWindow(this);
        }
        private void MinimizeButton_Click(object sender, RoutedEventArgs e)
        {
            SystemCommands.MinimizeWindow(this);
        }
    }

原始答案:

首先,commands是非常有用的设计模式,通过将源封装在对象中来将源与方法调用的目标分离。

您通过调用其Close()方法关闭窗口(目标),但通常此操作由用户触发,例如单击按钮(源)。如果您的UI非常简单,那么将此操作封装在命令中可能会有些过分(button.Click处理程序调用{​​{1}}),但typically不希望直接将UI元素相互绑定( window.Close()处理程序执行调用button.Click的{​​{1}}。

SystemCommandsApplicationCommandsComponentCommandsMediaCommandsNavigationCommandsEditingCommands只是ICommand接口的实现(遵循命令模式)所以你不必担心自己创建这些典型的对象。

这些命令到目标和源的实际连接取决于你(这就是为什么只执行它们不会做任何事情)。

最后,由于所有这些命令都是RoutedCommands,因此更适合与MVVM协调的方法是避免它们并实现属于ViewModel的自己的RelayCommandsDelegateCommands)。