如何关闭命令绑定到一个按钮(How to bind Close command to a butto

2019-06-24 13:36发布

最简单的方法是实施ButtonClick事件处理程序,并调用Window.Close()方法,但如何通过做这个Command绑定?

Answer 1:

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

使用RelayCommand从这篇文章http://msdn.microsoft.com/en-us/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}}}"/>


Answer 2:

它所需要的是一个有点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文章 )



Answer 3:

其实,这没有可能的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你的窗口,“窗口”,并添加这两个命名空间:

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

如果你没有混合,该SDK可以下载在这里 。



Answer 4:

我所知道的最简单的解决方案是将设置IsCancel属性密切的真实Button

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

没有绑定需要,WPF会自动为你做的!

参考: MSDN Button.IsCancel财产 。



Answer 5:

对于.NET 4.5 SystemCommands类会做的伎俩(.NET 4.0的用户可以使用WPF外壳扩展谷歌- Microsoft.Windows.Shell或尼古拉斯解决方案)。

    <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}"/>

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

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

    private void CloseWindow_Exec(object sender, ExecutedRoutedEventArgs e)
    {
        SystemCommands.CloseWindow(this);
    }


Answer 6:

一开始我也有一点麻烦搞清楚如何工作的,所以我想张贴什么是真正回事更好的解释。

根据我的研究来处理这样的事情最好的办法是使用命令绑定。 什么情况是“消息”广播到程序的一切。 所以,你必须做的是使用CommandBinding 。 这本质上做的是说“当你听到这个消息做到这一点”。

所以在问题的用户试图关闭窗口。 我们需要做的第一件事是建立我们的功能时,将调用SystemCommand.CloseWindowCommand是广播。 您也可以选择分配一个确定该命令应执行的功能。 一个例子是关闭表单和检查,如果用户已保存。

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如果你知道命令应该能够始终执行保存可能会根据应用的好例子。 这里是一个实施例:

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

最后,你需要告诉的UIElement发出的CloseWindowCommand。

<Button Command="SystemCommands.CloseWindowCommand">

它实际上是一个非常简单的事,只安装命令和实际函数来执行,然后告知控制之间的链路发送命令到你的程序说“Ok大家运行功能的命令CloseWindowCommand”休息。

这实际上是交给这一点,因为,你可以遍布重用执行的功能,而无需包装就像你使用的一种非常好的方式说的WinForms(使用ClickEvent并调用事件函数内的功能),如:

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

在WPF你附加功能的命令,告诉的UIElement执行连接到命令替代的作用。

我希望这将清除的东西了...



Answer 7:

我找到工作的一种选择是设定此功能,作为一个行为。

行为:

    public class WindowCloseBehavior : Behavior<Window>
{
    public bool Close
    {
        get { return (bool) GetValue(CloseTriggerProperty); }
        set { SetValue(CloseTriggerProperty, value); }
    }

    public static readonly DependencyProperty CloseTriggerProperty =
        DependencyProperty.Register("Close", typeof(bool), typeof(WindowCloseBehavior),
            new PropertyMetadata(false, OnCloseTriggerChanged));

    private static void OnCloseTriggerChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var behavior = d as WindowCloseBehavior;

        if (behavior != null)
        {
            behavior.OnCloseTriggerChanged();
        }
    }

    private void OnCloseTriggerChanged()
    {
        // when closetrigger is true, close the window
        if (this.Close)
        {
            this.AssociatedObject.Close();
        }
    }
}

在XAML窗口,设置了对它的引用和行为的关闭属性绑定到布尔你的视图模型“关闭”属性:

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
<i:Interaction.Behaviors>
    <behavior:WindowCloseBehavior Close="{Binding Close}" />
</i:Interaction.Behaviors>

因此,从视图分配一个ICommand来改变这势必行为的关闭属性视图模型的封闭性。 当PropertyChanged事件被触发行为触发的事件OnCloseTriggerChanged并关闭AssociatedObject的...这是窗口。



文章来源: How to bind Close command to a button