2016-06-08 3 views
0

Я установил KeyPreview = true; для своих Form. В основном я хочу использовать клавиши со стрелками, чтобы перейти к следующему и предыдущему изображениям вместо того, чтобы сменить фокус на разные элементы управления. Я установил свойство Handled в true, но все же изменения фокусировки нажимают клавишу со стрелкой.Изменения фокусировки даже после установки e.Handled = true

private void Form1_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.KeyCode == Keys.Delete) 
    { 
     // Do stuff 
    } 
    else if (e.KeyCode == Keys.Left) 
    { 
     // Do stuff 
     e.Handled = true; 
    } 
    else if (e.KeyCode == Keys.Right) 
    { 
     // Do stuff 
     e.Handled = true; 
    } 
} 

EDIT

поведение я хочу достичь следующим образом.

Left Arrow Key -> Previous Image
Right Arrow Key -> Next Image

Теперь у меня есть несколько TextBox эсов на моем Form и поэтому я не хочу, чтобы перейти к следующей и предыдущей картинке, если эти Textbox эсов находятся в центре внимания, потому что тогда он должен перемещаться по вместо этого текст.

+0

Что вам нужно именно? У вас есть форма, на которой есть некоторые элементы управления и окно с картинкой, и вы хотите изменить текущее изображение, которое отображается при нажатии стрелок влево/вправо? –

+0

'KeyDown',' KeyPress' и 'KeyUp' являются полностью независимыми событиями. Скорее всего, ваши другие элементы управления работают с одним из других событий, которые вы не «прерываете». И «KeyPress», и «KeyUp» широко используются. – Luaan

+0

@GeorgeLica Да. У меня также есть несколько «TextBox' на моей« форме », и поэтому я не хочу перейти к следующим и предыдущим изображениям, если эти« текстовые файлы »находятся в фокусе, потому что тогда он должен перемещаться по тексту вместо этого. –

ответ

1

Это сработало для меня.

  1. Не устанавливать KeyPreview = true; для Form.
  2. Переопределить ProcessCmdKey и обрабатывать по мере необходимости, если какой-либо из TextBox es не имеет фокуса.

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
    { 
    
        if (textBox1.ContainsFocus || textBox2.ContainsFocus || textBox3.ContainsFocus) 
        { 
         return base.ProcessCmdKey(ref msg, keyData); 
        } 
    
        if (keyData == Keys.Delete) 
        { 
         removeRect(); 
         return true; 
        } 
        else if (keyData == Keys.Left) 
        { 
         previousImg(); 
         return true; 
        } 
        else if (keyData == Keys.Right) 
        { 
         nextImg(); 
         return true; 
        } 
    
        else 
        { 
         return base.ProcessCmdKey(ref msg, keyData); 
        } 
    } 
    
Смежные вопросы