如何将Close命令绑定到按钮

iLe*_*ing 62 wpf button wpf-controls commandbinding

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

Nic*_*ong 71

只需要一点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>
Run Code Online (Sandbox Code Playgroud)

还有一点C#......

private void CloseCommandHandler(object sender, ExecutedRoutedEventArgs e)
{
    this.Close();
}
Run Code Online (Sandbox Code Playgroud)

(改编自此MSDN文章)

  • 使用命令的好处是它们不依赖于特定的UI控件; 您可以使用此命令通过相同的命令使用按钮,菜单选项甚至键盘快捷键来关闭应用程序.并且,虽然该功能并不真正适用于"关闭"操作,但命令还提供了一种在无法触发时自动禁用相应UI控件的方法 - 当没有文本时,禁用'粘贴'的方式在剪贴板中. (4认同)
  • +1使用内置的`ApplicationCommands.Close`命令. (3认同)
  • ...我认为没有c#代码也可以做到这一点。然后,以一种定义ButtonClick行为的旧方法来执行此操作似乎更好。 (2认同)

the*_*Dmi 62

实际上,没有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>
Run Code Online (Sandbox Code Playgroud)

为了使其工作,只需将x:Name窗口设置为"窗口",然后添加以下两个命名空间:

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 
xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
Run Code Online (Sandbox Code Playgroud)

这要求您将Expression Blend SDK DLL添加到项目中,具体而言Microsoft.Expression.Interactions.

如果您没有Blend,可以在此处下载SDK .

  • 在我添加`Microsoft.Expression.Interactions`作为参考之前,它不会识别`ei:`部分 (6认同)

Nir*_*Nir 49

我认为在现实世界的场景中,简单的点击处理程序可能比过于复杂的基于命令的系统更好,但你可以这样做:

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

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

  • 或者,如果您不想使用 RelayCommand,请编写自定义命令:`class WindowCloseCmd : ICommand { public bool CanExecute(object parameter) { return true; } public event EventHandler CanExecuteChanged { add { } remove { } } public void Execute(object wnd) { if (wnd is Window) ((Window)wnd).Close(); } } public static readonly ICommand WindowCloseCommand = new WindowCloseCmd();` (2认同)

pog*_*ama 42

我所知道的最简单的解决方案是将IsCancel属性设置为关闭的true Button:

<Button Content="Close" IsCancel="True" />
Run Code Online (Sandbox Code Playgroud)

不需要绑定,WPF会自动为您完成!

参考:MSDN Button.IsCancel属性.

  • 这也是一个方便的答案.IsCancel ="True",IsDefault ="True"仅在窗口显示w/Window.ShowDialog()而非Window.Show()时才起作用.这个属性似乎提供了一个简单的方法来说明这些是你将要显示的对话框上的"确定"和"取消"按钮w/Window.ShowDialog() (9认同)

kir*_*ran 5

对于.NET 4.5 SystemCommands类将起作用(.NET 4.0 用户可以使用 WPF Shell Extension google - Microsoft.Windows.Shell 或 Nicholas Solution)。

    <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.CloseWindowCommand}"/>
Run Code Online (Sandbox Code Playgroud)

在代码隐藏中,您可以像这样实现处理程序:

    private void CloseWindow_CanExec(object sender, CanExecuteRoutedEventArgs e)
    {
        e.CanExecute = true;
    }

    private void CloseWindow_Exec(object sender, ExecutedRoutedEventArgs e)
    {
        SystemCommands.CloseWindow(this);
    }
Run Code Online (Sandbox Code Playgroud)