Все, что я могу предложить для улучшения, это устранить необходимость в обработчике событий путем привязки к экземпляру статической команды.
Примечание. Это будет работать только в .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();
}
Затем вы можете привязать свой KeyBinding
к статическому Instance
свойству:
<Window.InputBindings>
<KeyBinding Key="Escape" Command="{x:Static local:CloseThisWindowCommand.Instance}" CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}" />
</Window.InputBindings>
Я не знаю, что это обязательно лучше , чем ваш подход, но это означает незначительное уменьшение шаблонного числа в верхней части каждого Window
и что вам не нужно включать обработчик событий в каждом