WPF: Как препятствовать тому, чтобы управление крало ключевой жест?

Оба точно эквивалентны. В идиоматическом использовании #ifdef используется только для проверки на definedness (и что я использовал бы в примере), тогда как #if используется в более сложных выражениях, таких как #if определил (A) & &! определенный (B).

14
задан Dirk Vollmar 14 December 2009 в 11:47
поделиться

3 ответа

Следующий обходной путь, кажется, дает желаемый эффект, заключающийся в том, что команда глобальна для окна; однако мне все еще интересно, нет ли более простого способа сделать это в 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;
                }
            }
        }
    }
}

}

10
ответ дан 1 December 2019 в 13:59
поделиться

Использование PreviewKeyDown - это именно то, что вы должны делать ... события «PreviewXYZ» запускаются снизу вверх (так что окно получает это сначала, затем элемент управления) ... который позволяет вам делать все, что вы хотите, глобально на уровне «Window».

Затем вы можете сказать «IsHandled = true», что предотвратит переход к следующему контроль (насколько вам известно), но вы не обязаны этого делать. Если вы хотите, чтобы событие вспыхнуло, просто добавьте свой код и оставьте для IsHandled значение false.

4
ответ дан 1 December 2019 в 13:59
поделиться

К сожалению, в WPF некоторые элементы управления имеют жесткий внутренний код обработки клавиатуры. Обработчик PreviewKeyDown в главном окне - это ответ на вопрос

Как определить сочетание клавиш, которое работает везде в главном окне

. И да, это означает, что вы можете выбрать переключатель/кейс по ключевым событиям в PreviewKeyDown вручную...

.
2
ответ дан 1 December 2019 в 13:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: