为什么在绑定到相关系统命令的命令绑定的处理程序之外调用SystemCommands.MaximizeWindow(this)不起作用?
为什么这些SystemCommands方法甚至存在?似乎所有这些功能都可以通过窗口本身来完成。
答案 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}}。
SystemCommands,ApplicationCommands,ComponentCommands,MediaCommands,NavigationCommands,EditingCommands只是ICommand接口的实现(遵循命令模式)所以你不必担心自己创建这些典型的对象。
这些命令到目标和源的实际连接取决于你(这就是为什么只执行它们不会做任何事情)。
最后,由于所有这些命令都是RoutedCommands,因此更适合与MVVM协调的方法是避免它们并实现属于ViewModel的自己的RelayCommands(DelegateCommands)。