2010-03-10 6 views
5

Я в follwing код (который не работает):WPF Keyboard Shortcut - Почему это не работает?

private void Window_PreviewKeyDown(object sender, KeyEventArgs e) { 
    e.Handled = true; 
    if ((e.Key == Key.P) && (Keyboard.Modifiers == ModifierKeys.Alt)) { 
     MessageBox.Show("Thanks!"); 
    }    
} 

Почему это не работает? Мероприятие является обжигом, но

(e.Key == Key.P) && (Keyboard.Modifiers == ModifierKeys.Alt)) 

никогда не оценивает истину. Мои похожие события, используя Ctrl вместо Alt таким образом работа. Также мои события, которые включают CtrlиAlt работа также.

+0

Является ли событие само по себе не стрельбой или не является условным, не оправдывающим истину? –

+0

Opps! Я исправлю свой вопрос. Благодаря! – Justin

+0

Разве это не приложение WPF? Если да, то какое это событие/источник, WPF 3.5 KeyEventArgs не имеет свойства модификаторов ???? –

ответ

3

Лучшим способом работы с ключами в WPF является Key Gestures

eg отметить, что это пример, а не решение

<Window.InputBindings> 
    <KeyBinding Command="ApplicationCommands.Open" Gesture="ALT+P" /> 
</Window.InputBindings> 

Там больше к этому, что это, но вы будете работать это достаточно легко. Это способ WPF обрабатывать ключи!

PK :-)

+0

Я немного читал о KeyBinding, но почему они лучше, чем использование ключевых событий? – Justin

+1

Все решение предназначено для использования в сочетании с ApplicationCommands и т. Д. Это просто аккуратный шаблон. Также вы можете абстрагировать команды и т. Д. Есть немного, но я не думаю, что вы действительно получите оригинальный способ работы из-за того, как огонь событий. –

+1

См. Http://msdn.microsoft.com/en-us/library/ms752308.aspx для официальной информации. Также взгляните на http://en.csharp-online.net/WPF_Concepts%E2%80%94Controls_with_Built-In_Command_Bindings - это может помочь с «почему?». :-) –

2

Вы должны сделать «побитовое и» с ModifierKeys, как показано ниже ...

 
    private void Window_PreviewKeyDown(object sender, KeyEventArgs e) 
    { 
     if ((e.Key == Key.P) && ((e.Modifiers & ModifierKeys.Alt) == ModifierKeys.Alt)) 
     { 
      MessageBox.Show("Thanks!"); 
      e.Handled = true; 
     } 
    } 

Кроме того, не забудьте установить Handled свойство параметра e ...

+0

Я случайно использовал e.Modifiers в своем примере кода вместо Keyboard.Modifiers, который я фактически использую в своем приложении. Я извиняюсь. Я не смог заставить ваш пример работать с Keyboard.Modifiers. – Justin

+0

Я не могу заставить это работать? –

0

MSDN дает нам этот пример:

if(e.Key == Key.P && e.Modifiers == Keys.Alt) 

делает эту работу за вас?

+0

Как сказал Пол Колер: «WPF 3.5 KeyEventArgs не имеет свойства модификаторов» Я ошибочно использовал e.Modifiers в своем примере кода. Прошу прощения за путаницу. – Justin

+0

Я думаю, что некоторые из нас были брошены этим!Я думал, что это был вопрос WinForms поначалу :) –

+0

ditto :-) * memo для себя: читать теги * –