2009-04-21 4 views
2

안녕하세요, F1 키를 눌렀을 때 (포커스가있는 컨트롤의 컨텍스트에서) 사용자에게 도움을 제공하기 위해 C#으로 작성된 Windows 응용 프로그램을 확장하려고합니다.사용자 도움말의 모든 컨트롤에 대한 전역 이벤트 핸들러

내가 원하는 것은 Control.HelpRequested 이벤트를 사용하는 것이지만이 컨트롤을 모든 컨트롤을 확장하여이 이벤트를 처리하는 방법을 잘 모르겠습니다. http://msdn.microsoft.com/en-us/library/system.windows.forms.control.helprequested.aspx

그것의 이벤트를 연결하는이 이벤트를 처리하고 (폼이 열릴 때) 정말 형태로 모든 컨트롤을 통해 반복의 아이디어를 좋아하지 않는다 "손으로"각 컨트롤을 업데이트 할 정말 가능하지 매니저.

특정 이벤트를 처리하도록 양식의 모든 컨트롤을 확장하는 깔끔한 방법이 있습니까?

단지로 구성되어 있습니다하지만 난 많은 감사하는이

[HandleEvent Control.HelpRequested, ApplyTo Typeof(Control)] 
void MyEventHandler(object sender, EventArgs e) 
{ 
// code to handle event... 
}

어떤 제안이나 다른 접근 방식에 아마 아이디어 같은 것을 쓸 수 있어야처럼 나는 거의 느낀다 -

답변

2

이 예제 (http://www.codeproject.com/KB/cs/ContextHelpMadeEasy.aspx)는 WndProc에서 F1 키를 트랩 한 다음 한 가지 방법으로 만 도움말을 표시하는 방법을 보여줍니다.

이 기사의 아이디어는 컨트롤의 ID를 노출하는 인터페이스를 구현 한 다음 해당 ID를 기반으로 컨텍스트 도움말을 표시하는 것입니다. 그런 다음 F1 처리기는 해당 컨트롤이 해당 인터페이스를 구현하는지 확인하고, 그렇지 않으면 인터페이스의 구현을 찾을 때까지 컨트롤의 부모를 확인합니다.

그러나 더 간단한 접근법 (각 컨트롤에 ID를 추가하지 않으려는 경우)은 주제 유형 ID를 포함하는 정적 유형 사전 (예 : 사전)을 기반으로하는 상황 별 도움말을 표시하도록 F1 처리기를 수정하는 것입니다 지원되는 모든 컨트롤에 대해 따라서 특정 컨트롤과 항목을 연결해야 할 때마다 사전을 업데이트해야합니다.

다시 말하면, 사전에 일종의 공급자 (위임 또는 인터페이스)를 추가하여이 접근법에 더 많은 추상화를 추가하는 것이 현명 할 것입니다. 예를 들어, 컨트롤의 유형, 이름 또는 기타 속성을 기반으로 항목을 표시하려면 추가 논리가 필요할 수 있습니다.

+0

사실 저는이 기사를 이미 읽었으며 지금까지는 ProcessKeyPreview 메서드를 구현했습니다. (btw 도움말 컨텍스트가 데이터베이스에서 직접 가져와야하므로 윈도우 도움말 파일 형식이 isn이 아닙니다. 옵션). –

+0

그런 다음 컨트롤을 클릭하고 컨텍스트 도움말을 다시 볼 수있는 물음표 단추 (대개 양식의 오른쪽 상단)를 사용하여 도움을 제공해야한다는 것을 기억했습니다. 오늘 아침에 약간의 연구가 끝나자. 닷넷 프레임 워크가 개발자를 위해 특별히 헬프 시스템을 구현하기 위해이 이벤트를 드러내고 있기 때문에 F1 키 트래핑보다 더 적합한 HelpRequested 이벤트가 나타났습니다. 모두 같은 제안을 얻습니다 - 감사합니다 :) –

+0

예, 제안 된 솔루션이지만, "전역"이벤트를 발생 시키려면 WndProc에서 직접 실행하고 단일 이벤트 처리기를 사용할 수 있습니다. – Groo

0

감사합니다 나는 이벤트 핸들러를 연결하기 위해 양식이 열릴 때 양식의 모든 컨트롤을 루핑한다는 생각을 정말로 좋아하지 않습니다.

이유는 무엇일까요?

대리자와 형식 목록을 인수로 취하는 함수를 작성할 수 있습니다.이 함수는 원하는 "HandleEvent"특성과 동일한 효과를냅니다.

+1

을 이 작업을 수행하는 '깨끗한'방법처럼 느껴지지 않습니다. 코드가 제어 계층을 '걸어야'합니다. 당신의 위임 제안은 분명히 일할 것입니다, 고마워요 :) –

0

HelpRequested은 버블 업 메커니즘을 지원합니다. 귀하의 활성 컨트롤에 대한 화재 및 이벤트를 처리하지 않고 true에 대한 이벤트 arg 속성을 Handled arg 설정하지 않으면 최대 상위 폼 컨트롤 계층 구조 위로 거품이.

폼의 HelpRequested을 처리하기 만하면 양식 또는 상위 계층 구조의 활성 제어를 기반으로 표시하려는 도움말을 결정할 수 있습니다.아래 같은 형태의 HelpRequested 이벤트를 처리 할 경우 F1을 누르면

, 다음 메시지 상자가 나타납니다 및 활성 제어의 이름을 보여 음을

private void Form1_HelpRequested(object sender, HelpEventArgs hlpevent) 
{ 
    var c = this.ActiveControl; 
    if(c!=null) 
     MessageBox.Show(c.Name); 
} 
+0

이 질문은 오래된 질문이지만, 그 대답은 미래의 독자를 도울 수 있습니다. 왜 그런 대답이 거의 2500 번보기 후에 제공되지 않았는지 이상합니다! –

관련 문제