2014-05-23 2 views
3

사용자가 응용 프로그램에 사용자 지정 단축키를 지정할 수있는 설정 양식을 만들고 있습니다. 이 텍스트 상자는, 그리고 (다른 라벨을 중심으로) 마우스로 클릭하여, 그것은 초점을 맞추고 하나의 키를 누를 때까지 대기 한 후 집속 : TextBox를 다시 클릭하여 초점 맞추기

private void txtKey_KeyDown(object sender, KeyEventArgs e) 
{ 
    e.SuppressKeyPress = true; 
} 

private void txtKey_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) 
{ 
    TextBox textBox = (TextBox)sender; 
    textBox.Text = e.KeyCode.ToString(); 
    label1.Focus(); 
} 

키 assinging 과정을 집중 텍스트 상자를 디 포커스 (와 취소 할 수있는 방법이 있나요), 마우스로 다시 클릭하거나 그 주위의 GroupBox를 클릭하여? TextBox가 클릭되었을 때 이미 포커스가 맞춰 졌는지 확인하는 방법을 알아낼 수 없습니다 (클릭했을 때 포커스가 맞는지 테스트하기 전에 포커스가 집중됨). 물론 TextBox 옆에 "Cancel"버튼을 추가 할 수는 있지만 원하는 것은 아닙니다.

GroupBox의 Click 이벤트가 없으므로 GroupBox를 클릭하여 TextBox의 초점을 해제 할 수 없습니다. 아니면 내가 어떻게 할 수 있니?

+0

'GroupBox' 내에서'Panel' 컨트롤을 사용하지 않는 이유는'Panel'에'MouseClick' 이벤트가 있기 때문입니다. – sallushan

+0

이런 종류의 작품. 더 나은 해결책을 찾을 수 없다면이 방법을 사용하겠습니다. 이 문제는 그 패널 내부의 모든 레이블에 Click 이벤트를 설정하고 패널을 모든 GroupBox에 추가해야한다는 것입니다. 그리고 GroupBox 테두리는 여전히 작동하지 않으므로 조금 더러운 접근 방식이지만 어쨌든 감사합니다! – darx

+0

대화 상자에 [확인] 및 [취소] 단추 이외의 다른 포커스를 지정할 수있는 컨트롤이없는 경우 "취소 중"의 의미는 무엇입니까? 사용자는 단순히 키보드를 사용할 다른 좋은 이유가 없습니다. –

답변

0

의견을 보내 주시면 감사하겠습니다. 나는 click 이벤트로 플래그를 설정하고, 플래그를 설정하기 전에 플래그가 설정되어 있는지 테스트합니다. 따라서 첫 번째 클릭은 플래그를 찾지 못하지만 두 번째는 나타납니다. 텍스트 이벤트 입력 이벤트 (Click-event 이전에 실행 됨) 내에서 플래그가 지워집니다. 이제는 원하는대로 모든 클릭이 초점을 맞추고 다른 모든 것은 텍스트 상자에 초점을 맞 춥니 다.

private void txtKey_Enter(object sender, EventArgs e) 
{ 
    TextBox textBox = (TextBox)sender; 
    textBox.Tag = null; 
} 

private void txtKey_Click(object sender, EventArgs e) 
{ 
    TextBox textBox = (TextBox)sender; 
    if (textBox.Tag != null) label1.Focus(); 
    textBox.Tag = "clicked"; 
} 
0

당신은 또한 다음과 같은 이벤트에 등록 할 수 있습니다

Keyboard.Focus = null; 

으로 포커스를 제거/설정할 수 있습니다, 따라서 사용자가 설정할 수,

public event MouseButtonEventHandler PreviewMouseLeftButtonDown 

이 이벤트가 발생하면 텍스트 상자를 클릭 할 때마다 당신이 원한다면 초점.

Winforms에는 방법이 있습니다. 나는 그것에 익숙하지 않지만 여기에 방법이있을 것입니다 : 귀하의 창 밖에있는 textBox (예 : textBoxFocus)를 만드십시오. 크기를 1, 1로하고 -10, -10으로 이동하십시오. 그런 다음 Click 이벤트에 등록하고 쓸 수 있습니다.

textBoxFocus.Focus(); 

약간의 로터리 방식이지만 원하는 것을 달성해야합니다.

+0

고마워,하지만 이들은 WPF와 관련된 것들이지 winforms가 아니야? – darx

+0

안녕하세요! winforms 태그가 누락되어 죄송합니다. 나는 나의 대답을 업데이트했다. –

+0

안녕하세요, 문제 없습니다! 하지만 제 질문에 설명 된 것처럼 레이블을 붙이는 것 (텍스트가없는 것)과 같은 것이 아닙니까? 문제는 다른 컨트롤을 포커스하기 위해 TextBox 클릭 이벤트를 등록하면 TextBox를 포커스 지정하여 단축키를 지정할 수 없다는 것입니다. 내가 원하는 것은 이미 집중되었을 때 TextBox를 다시 클릭하면 다른 컨트롤에 집중하는 것입니다. – darx

0

간단한 방법 중 하나는 여기에 bool 플래그를 사용할 수 있다는 것입니다. 알고리즘 :

By default, the bool value is 0; 
If(Textbox Selected && flag = 0) 
    Do your task; and flag = 1; 

은 내가 당신의 쿼리를 만족시킬 수 있으며,이 알고리즘을 따를 수 있기를 바랍니다.