2013-11-19 7 views
2

В настоящее время я работаю над winform, на котором есть панель. Я должен иметь возможность использовать стрелки вверх, вниз, влево и вправо на панели и что-то произойдет.Не удалось создать событие KeyDown в панели

Я попытался добавить событие с этой строки кода:

  (MainPanel as Control).KeyDown += 
           new KeyEventHandler(panelKeyPressEventHandler); 

С этим KeyDown код:

 public void panelKeyPressEventHandler(object sender, System.Windows.Forms.KeyEventArgs e) 
    { 

     MessageBox.Show("Here I am!"); 

     switch (e.KeyCode) 
     { 
      case Keys.L: 
       { 

        break; 
       } 
      case Keys.R: 
       { 

        break; 
       } 
      case Keys.Up: 
       { 
        break; 
       } 
      case Keys.Down: 
       { 
        break; 
       } 
      case Keys.Right: 
       { 
        break; 
       } 
      case Keys.Left: 
       { 
        break; 
       } 

     } 
    } 

До сих пор, даже когда я гарантирую, фокус установлен на панели, я неспособный заставить его ввести эту функцию события KeyDown для чего угодно. :(Я могу ударить ключи целый день и ничего не происходит.

Кто-нибудь есть какие-либо предложения по лучшим способом справиться вверх, вниз, влево и вправо нажат, когда панель имеет фокус?

Спасибо !

+0

Что вы хотите совершить? Вполне вероятно, что вы захотите установить там какой-то другой элемент управления, «Dock.Fill», а затем отреагируйте на это. Вы можете делать вещи с помощью панели, но это более полезно для того, чтобы просто держать вещи, с которыми вы хотите играть. – DonBoitnott

+1

Возможный дубликат [Панель не получает фокус] (http://stackoverflow.com/questions/3562235/panel-not-getting-focus) –

ответ

3

управления Panel не может получить фокус и не выбирается также. сфокусированные элементы управления могут получить только «ключевые события». скорее всего, вы должны переопределить ProcessCmdKey в вашей форме или UserControl.

Вы должны установить KeyPreview = true

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
{ 
    switch(keydata) 
    { 
     case Keys.Up: 
      break; 
     ... 
    } 
    return base.ProcessCmdKey(ref msg, keyData); 
} 
+0

Немного слишком широкий, если в форме много материала. На самом деле понятия не имею, какова цель. Этот гигантский ловушка может оказаться контрпродуктивным. – DonBoitnott

+0

@DonBoitnott Я не думаю, что это контрпродуктивно. Знаете ли вы, что ключевые события не поддерживаются в панели управления? –

+0

Я сказал, что это может быть контрпродуктивным. Использование 'ProcessCmdKey' в качестве первой опции для получения нажатий клавиш является неаккуратным. Вместо этого используйте «Панель» по своему назначению и поставьте элемент управления, который _is designed_ для захвата ключей. – DonBoitnott

Смежные вопросы