2014-02-07 2 views
2

У меня есть 5 кнопок в приложении для Windows. При нажатии клавиши со стрелками фокус изменения между кнопками, а затем стрельба толькоЗапуск события KeyUp от следующего управления

KeyUp

событие. Как остановить это?

+0

Вы хотите остановить событие «KeyUp» от стрельбы? Или вы хотите, чтобы какое-то другое событие, например «KeyDown», срабатывало? –

+1

Я хочу, чтобы событие KeyUp было запущено с точной кнопки, которая имела фокус, когда я нажал клавишу со стрелкой. –

+0

Это поведение по умолчанию. Когда вы нажмете клавишу со стрелкой, фокус изменится на следующий элемент управления, а затем вы отпустите клавишу, чтобы вы получили событие KeyUp от следующей кнопки. Если вы не отпустите ключ в течение длительного времени, он продолжит смену фокуса от одного к другому, а когда вы отпустите ключ, вы получите событие KeyUp из целенаправленного управления. – Sameer

ответ

1

Подпишитесь на мероприятие PreviewKeyDown.

Происходит перед событием KeyDown, когда нажата клавиша, когда фокус находится на этом элементе управления.

При перемещении по кнопкам параметр sender будет содержать ранее выбранную кнопку.


Я нашел решение, которое должно работать для вас, адаптированный here. По-видимому, MS решила, что клавиши со стрелками не вызовут событие KeyDown, поэтому вы не можете их отменить.

Одним из способов является указание, что ваши клавиши со стрелками являются нормальными клавишами ввода, как и любой другой ключ. Затем загорится событие KeyDown, и вы можете отменить нажатие кнопки, если хотите.

private void button1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) 
{ 
    if (e.KeyCode == Keys.Left || e.KeyCode == Keys.Right || e.KeyCode == Keys.Up || e.KeyCode == Keys.Down) 
     e.IsInputKey = true; 
} 

private void button1_KeyDown(object sender, KeyEventArgs e) 
{ 
    e.Handled = true; 
} 

Вы можете прочитать другие ответы и комментарии в that post, чтобы посмотреть, что будет работать лучше в вашей ситуации.

+0

Можете ли вы сказать, что я должен делать в PreviewKeyDown, чтобы остановить перемещение фокуса до следующего элемента управления? –

+0

Думаю, я вижу, что вы сейчас пытаетесь сделать. Я отредактировал свой ответ. –

+0

Да, это то, что мне нужно. Но я нашел это, прежде чем вы отправили сообщение. В любом случае, хорошо, чтобы показать ответ. –

0

Ответ на Ваш вопрос в комментарии

void button1_LostFocus(object sender, EventArgs e) 
    { 
     button1.Focus(); 
    } 
+0

Он только фокусирует кнопку1 каждый раз.На самом деле я хочу сосредоточиться на кнопке, в которой я нажал клавишу со стрелкой. –

0

Чтобы предотвратить Up от перемещения фокуса от Button вы должны использовать как минимум 3 метода:

bool _focus; 

    private void button1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) 
    { 
     if (e.KeyCode == Keys.Up) 
      _focus = true; 
    } 

    private void button1_KeyUp(object sender, KeyEventArgs e) 
    { 
     _focus = false; 
    } 

    private void button1_Leave(object sender, EventArgs e) 
    { 
     if(_focus) 
      button1.Focus(); // or (sender as Control) 
    } 

Trick является использование флага, когда нажмите Вверх и вернуть фокус в Leave. Вы должны развязать в KeyUp, иначе было бы невозможно изменить фокус (нажав Tab в пример).

Вы можете поменять флаг в Leave, я не тестировал его.

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