Существует намного лучший способ получить эту функциональность в WPF. Это система командования , и она потрясающая. Любая кнопка, пункт меню, горячая клавиша и т. Д. Могут быть связаны с командой single , которая автоматически обрабатывает включение / отключение (как вы хотите в своей программе). Это также чистый и многоразовый, и оооочень простой в использовании.
Например, в моем приложении у меня есть «окно диалога», которое появляется, когда пользователь нажимает клавишу F1. Я создал команду с именем AboutCommand
, реализовав ICommand
.
public class AboutCommand:System.Windows.Input.ICommand
{
public bool CanExecute(object parameter)
{
return true; // in this case the command is never disabled
}
public event EventHandler CanExecuteChanged
{
// not needed in this case, but in commands when CanExecute actually
// changes, this performs the "magic" of disabling/enabling your controls
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
public void Execute(object parameter)
{
new AboutWindow().ShowDialog(); //happens when the command is executed
}
}
Затем в xaml моего окна я добавил *:
<Window.Resources>
<local:AboutCommand x:Key="About"/>
</Window.Resources>
<Window.InputBindings>
<KeyBinding Command="{StaticResource About}" Gesture="F1"/>
</Window.InputBindings>
Вы можете также установить команду для кнопки следующим образом.
<Button Command="{StaticResource About}" Content="About this program"/>
Клавиша F1 и будут отключены, если AboutCommand.CanExecute()
вернет false.
* (Я фактически сделал это по-другому, потому что я использую шаблон MVVM, но это работает, если вы не используете этот шаблон.)