Все, что я могу предложить улучшить, это удалить необходимость в обработчике событий путем привязки к экземпляру статической команды.
Примечание: это будет работать только в .NET 4, поскольку оно требует возможности привязки к свойствам KeyBinding
.
Во-первых, создать команду, которая принимает окно в качестве параметра и вызывает 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
и что вам не нужно включать обработчик событий в каждом
может ли это привести к утечки памяти, так как у singleton есть «EventHandler»? – Maslow
Этого не должно быть, но поскольку мы действительно не заботимся о функциях «CanExecute», которые вы можете защитить от него, если «CanExecute» всегда возвращает true и заменяет обработчик «CanExecuteChanged» пустыми реализациями вложений (например, «public event EventHandler» CanExecuteChanged {add {} remove {}} ') –