如何为项目中的所有WPF窗口分配"关闭退出键按下"行为?

Pet*_*háč 22 wpf command escaping key-bindings windows-applications

是否有任何直接的方式告诉整个WPF应用程序通过尝试关闭当前关注的寡妇来对Escape键按下做出反应?手动设置命令和输入绑定并不是很麻烦但是我想知道在所有窗口中重复这个XAML是否是最优雅的方法?

<Window.CommandBindings>
        <CommandBinding Command="Close" Executed="CommandBinding_Executed" />
</Window.CommandBindings>
<Window.InputBindings>
        <KeyBinding Key="Escape" Command="Close" />
</Window.InputBindings>
Run Code Online (Sandbox Code Playgroud)

任何建设性的建议欢迎!

Ste*_*rex 32

我可以建议改进的是通过绑定到静态命令实例来消除对事件处理程序的需要.

注意:这仅适用于.NET 4以上,因为它需要能够绑定到KeyBinding属性.

首先,创建一个命令,将Window作为参数并Close在Execute方法中调用:

public class CloseThisWindowCommand : ICommand
{
    #region ICommand Members

    public bool CanExecute(object parameter)
    {
        //we can only close Windows
        return (parameter is Window);
    }

    public event EventHandler CanExecuteChanged;

    public void Execute(object parameter)
    {
        if (this.CanExecute(parameter))
        {
            ((Window)parameter).Close();
        }
    }

    #endregion

    private CloseThisWindowCommand()
    {

    }

    public static readonly ICommand Instance = new CloseThisWindowCommand();
}
Run Code Online (Sandbox Code Playgroud)

然后你可以绑定你KeyBinding的静态Instance属性:

<Window.InputBindings>
    <KeyBinding Key="Escape" Command="{x:Static local:CloseThisWindowCommand.Instance}" CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}" />
</Window.InputBindings>
Run Code Online (Sandbox Code Playgroud)

我不知道这一定比你的方法更好,但它确实意味着每个顶部的样板少一些Window,你不需要在每个都包含一个事件处理程序


小智 20

或者你可以添加一个带有取消的按钮作为文本并设置IsCancel = True.然后Escape将作为默认命令关闭.