如何将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.CloseWindowCommand
和CloseApp
和CloseAppCanExecute
之间的“连接”
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执行附加到命令的函数。
我希望这个清理的事情…