Оба точно эквивалентны. В идиоматическом использовании #ifdef используется только для проверки на definedness (и что я использовал бы в примере), тогда как #if используется в более сложных выражениях, таких как #if определил (A) & &! определенный (B).
Следующий обходной путь, кажется, дает желаемый эффект, заключающийся в том, что команда глобальна для окна; однако мне все еще интересно, нет ли более простого способа сделать это в WPF:
private void Window_PreviewKeyDown(object sender, KeyEventArgs e)
{
foreach (InputBinding inputBinding in this.InputBindings)
{
KeyGesture keyGesture = inputBinding.Gesture as KeyGesture;
if (keyGesture != null && keyGesture.Key == e.Key && keyGesture.Modifiers == Keyboard.Modifiers)
{
if (inputBinding.Command != null)
{
inputBinding.Command.Execute(0);
e.Handled = true;
}
}
}
foreach (CommandBinding cb in this.CommandBindings)
{
RoutedCommand command = cb.Command as RoutedCommand;
if (command != null)
{
foreach (InputGesture inputGesture in command.InputGestures)
{
KeyGesture keyGesture = inputGesture as KeyGesture;
if (keyGesture != null && keyGesture.Key == e.Key && keyGesture.Modifiers == Keyboard.Modifiers)
{
command.Execute(0, this);
e.Handled = true;
}
}
}
}
}
}
Использование PreviewKeyDown - это именно то, что вы должны делать ... события «PreviewXYZ» запускаются снизу вверх (так что окно получает это сначала, затем элемент управления) ... который позволяет вам делать все, что вы хотите, глобально на уровне «Window».
Затем вы можете сказать «IsHandled = true», что предотвратит переход к следующему контроль (насколько вам известно), но вы не обязаны этого делать. Если вы хотите, чтобы событие вспыхнуло, просто добавьте свой код и оставьте для IsHandled значение false.
К сожалению, в WPF некоторые элементы управления имеют жесткий внутренний код обработки клавиатуры. Обработчик PreviewKeyDown
в главном окне - это ответ на вопрос
Как определить сочетание клавиш, которое работает везде в главном окне
. И да, это означает, что вы можете выбрать переключатель/кейс по ключевым событиям в PreviewKeyDown вручную...
.