2014-02-07 3 views
2

내 Windows 응용 프로그램에 5 개의 버튼이 있습니다. 그때, 버튼 사이에 변화 초점 화살표 키를 클릭하면 발사에만다음 컨트롤에서 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을 읽고 상황에 가장 적합한 것이 무엇인지 확인하십시오.

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) 
    } 

트릭 때 플래그를 사용하는 것입니다 : 코멘트에있는 당신의 질문에 대한

+0

다음 컨트롤로 포커스 이동을 멈추려면 PreviewKeyDown에서 무엇을해야하는지 알 수 있습니까? –

+0

나는 당신이 지금하려고하는 것을 보았다고 생각합니다. 나는 내 대답을 편집했다. –

+0

네, 이것이 제가 필요한 것입니다. 하지만 당신이 게시하기 전에 이것을 발견했습니다. 어쨌든 대답을 보여 주면 좋습니다. –

0

대답

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

매번 버튼 1 만 초점을 맞 춥니 다.사실 저는 화살표 키를 누른 버튼에 초점을 맞추기를 원합니다. –

0

는 적어도 3 가지 방법을 활용 가지고 Button에서 초점을 이동까지 을 방지하기 위해 사용자 을 누르고 포커스를 Leave에 반환하십시오. KeyUp의 플래그를 해제해야합니다. 그렇지 않으면 Tab을 누르면 초점을 변경할 수 없습니다.

Leave의 신호를 해제 할 수 있습니다. 테스트하지 않았습니다.

관련 문제