wpf - SystemCommands.[SomeWindowAction] 在命令之外 :

标签 wpf .net-4.5

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

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

最佳答案

编辑:

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

即使在命令绑定(bind)处理程序之外它们也应该工作得很好(假设显示了窗口):

<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 处理程序调用 window.Close())但是 typically最好不要将 UI 元素直接相互绑定(bind)(button.Click 处理程序执行调用 window.Close()command)。

SystemCommands , ApplicationCommands , ComponentCommands , MediaCommands , NavigationCommands , EditingCommands只是 ICommand 接口(interface)的实现(遵循命令模式),因此您不必担心自己创建这些典型对象。

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

最后,因为所有这些命令都是 RoutedCommands一个更适合 MVVM 的方法是避免它们并实现你自己的 RelayCommands ( DelegateCommands ) 是您的 ViewModel 的一部分。

关于wpf - SystemCommands.[SomeWindowAction] 在命令之外 :,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20601688/

相关文章:

c# - 如何删除 wpf 中动态添加的控件

wpf - 箭头的 xaml 路径数据

.net - 在 Windows XP 上运行时 TextBox.Text 绑定(bind)错误

asp.net-mvc - MVC4是否已烘焙到.NET 4.5中?

c# - 工作流基础 4.5 "Expression Activity type ' CSharpValue` 1' requires compilation in order to run."

c# - WPF 验证取决于必填/非必填字段

c# - 在 Xaml 中声明元组

c# - 在 64 位进程中加载​​ 32 位 dll

c# - Dapper DynamicParameters 对象是否可以像参数字典一样被枚举?

c# - async/await - 何时返回 Task 与 void?