Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I assign the 'Close on Escape-key press' behavior to all WPF windows within a project?

Tags:

Is there any straightforward way of telling the whole WPF application to react to Escape key presses by attempting to close the currently focused widow? It is not a great bother to manually setup the command- and input bindings but I wonder if repeating this XAML in all windows is the most elegant approach?

<Window.CommandBindings>         <CommandBinding Command="Close" Executed="CommandBinding_Executed" /> </Window.CommandBindings> <Window.InputBindings>         <KeyBinding Key="Escape" Command="Close" /> </Window.InputBindings> 

Any constructive suggestions welcome!

like image 449
Peter Perháč Avatar asked Oct 05 '10 12:10

Peter Perháč


2 Answers

All I can suggest to improve on that is to remove the need for an event handler by binding to a static command instance.

Note: this will only work in .NET 4 onwards as it requires the ability to bind to the KeyBinding properties.

First, create a command that takes a Window as a parameter and calls Close within the Execute method:

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(); } 

Then you can bind your KeyBinding to the static Instance property:

<Window.InputBindings>     <KeyBinding Key="Escape" Command="{x:Static local:CloseThisWindowCommand.Instance}" CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}" /> </Window.InputBindings> 

I don't know that this is necessarily better than your approach, but it does mean marginally less boilerplate at the top of every Window and that you don't need to include an event handler in each

like image 75
Steve Greatrex Avatar answered Oct 05 '22 16:10

Steve Greatrex


Or you could just add a button with Cancel as text and set IsCancel = True. Then Escape will work as default command to close.

like image 40
Kai Avatar answered Oct 05 '22 16:10

Kai