如何将closures命令绑定到一个button

最简单的方法是实现ButtonClick事件处理程序并调用Window.Close()方法,但是如何通过Command绑定来完成此操作?

我认为,在现实世界的情况下,一个简单的点击处理程序可能比复杂的基于命令的系统更好,但是你可以这样做:

使用本文中的RelayCommand http://msdn.microsoft.com/zh-cn/magazine/dd419663.aspx

 public class MyCommands { public static readonly ICommand CloseCommand = new RelayCommand( o => ((Window)o).Close() ); } <Button Content="Close Window" Command="{X:Static local:MyCommands.CloseCommand}" CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}"/> 

它只需要一点XAML …

 <Window x:Class="WCSamples.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <Window.CommandBindings> <CommandBinding Command="ApplicationCommands.Close" Executed="CloseCommandHandler"/> </Window.CommandBindings> <StackPanel Name="MainStackPanel"> <Button Command="ApplicationCommands.Close" Content="Close Window" /> </StackPanel> </Window> 

还有一点C#

 private void CloseCommandHandler(object sender, ExecutedRoutedEventArgs e) { this.Close(); } 

(从这个MSDN文章改编而来)

其实,没有C#代码可能的。 关键是要使用交互:

 <Button Content="Close"> <i:Interaction.Triggers> <i:EventTrigger EventName="Click"> <ei:CallMethodAction TargetObject="{Binding ElementName=window}" MethodName="Close"/> </i:EventTrigger> </i:Interaction.Triggers> </Button> 

为了这个工作,只需将窗口的x:Name设置为“window”,并添加这两个命名空间:

 xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions" 

这要求您将Expression Blend SDK DLL添加到您的项目,特别是Microsoft.Expression.Interactions

如果你没有Blend,SDK可以在这里下载。

我知道的最简单的解决scheme是将IsCancel属性设置为closuresButton值为true:

 <Button Content="Close" IsCancel="True" /> 

没有绑定需要,WPF会自动为你做到这一点!

参考: MSDN Button.IsCancel属性 。

对于.NET 4.5 SystemCommands类将做的伎俩(NET 4.0用户可以使用WPFshell扩展谷歌 – Microsoft.Windows.Shell或尼古拉斯解决scheme)。

  <Window.CommandBindings> <CommandBinding Command="{x:Static SystemCommands.CloseWindowCommand}" CanExecute="CloseWindow_CanExec" Executed="CloseWindow_Exec" /> </Window.CommandBindings> <!-- Binding Close Command to the button control --> <Button ToolTip="Close Window" Content="Close" Command="{x:Static SystemCommands.RestoreWindowCommand}"/> 

在代码后面你可以像这样实现处理程序:

  private void CloseWindow_CanExec(object sender, CanExecuteRoutedEventArgs e) { e.CanExecute = true; } private void CloseWindow_Exec(object sender, ExecutedRoutedEventArgs e) { SystemCommands.CloseWindow(this); } 

一开始我也遇到了一些麻烦,想知道这是如何工作的,所以我想发布一个更好的解释。

根据我的研究,处理这种事情的最好方法是使用命令绑定。 发生什么事是一个“消息”被广播给程序中的所有东西。 所以你必须做的是使用CommandBinding 。 这基本上是做什么的,当你听到这个消息的时候这么做。

所以在问题中,用户正试图closures窗口。 我们需要做的第一件事是设置我们的函数,当SystemCommand.CloseWindowCommand被广播时将被调用。 或者,您可以分配一个函数来确定是否应该执行该命令。 一个例子是closures一个表单,并检查用户是否已经保存。

MainWindow.xaml.cs(或其他代码隐藏)

 void CloseApp( object target, ExecutedRoutedEventArgs e ) { /*** Code to check for State before Closing ***/ this.Close(); } void CloseAppCanExecute( object sender, CanExecuteRoutedEventArgs e ) { /*** Logic to Determine if it is safe to Close the Window ***/ e.CanExecute = true; } 

现在我们需要设置SystemCommands.CloseWindowCommandCloseAppCloseAppCanExecute之间的“连接”

MainWindow.xaml(或任何实现CommandBindings)

 <Window.CommandBindings> <CommandBinding Command="SystemCommands.CloseWindowCommand" Executed="CloseApp" CanExecute="CloseAppCanExecute"/> </Window.CommandBindings> 

如果您知道该命令应该始终可以执行,则可以省略CanExecute。根据应用程序,Save可能是一个很好的示例。 这里是一个例子:

 <Window.CommandBindings> <CommandBinding Command="SystemCommands.CloseWindowCommand" Executed="CloseApp"/> </Window.CommandBindings> 

最后你需要告诉UIElement发送CloseWindowCommand。

 <Button Command="SystemCommands.CloseWindowCommand"> 

它实际上是一个非常简单的事情,只要设置命令和实际的执行function之间的联系,然后告诉控制发出命令到你的程序的其余部分,说:“好吧,每个人都运行你的函数的命令CloseWindowCommand”。

这实际上是一个非常好的处理方式,因为你可以重复使用Executed Function,而不需要像WinForms(使用ClickEvent和调用Event Function中的函数)那样的包装器:

 protected override void OnClick(EventArgs e){ /*** Function to Execute ***/ } 

在WPF中,将函数附加到命令,并告诉UIElement执行附加到命令的函数。

我希望这个清理的事情…