2011-08-08 3 views
3

winforms 및 마우스 휠 이벤트에 약간의 문제가 있습니다. 슬라이더를 나타내는 사용자 정의 사용자 정의 컨트롤이 있습니다. 이제 각 그룹이 패널 안에 싸여있는 몇 개의 슬라이더 그룹이 있습니다. 그런 다음 모든 그룹이 다른 패널 (AutoScroll이 true로 설정되어 있음)에 싸여 있으며이 패널이 양식으로 묶여 있습니다. 슬라이더 로직은 마우스 휠이 값을 변경하는 데 사용될 수 있도록 구현됩니다. 이를 위해 슬라이더 사용자 컨트롤은 마우스가 슬라이더 위에있을 때 포커스를 얻습니다. 그러나 스크롤 할 때 AutoScroll 상위 패널도 함께 스크롤됩니다. 저는 이미이 문제에 많은 시간을 낭비했습니다. 아무도 여기서 무슨 일이 일어나는 지 알고 어떻게 해결할 수 있습니까? 이벤트가 부모 패널에 버블 링되고 있다고 생각했지만 Slider 컨트롤에서 WPF로 처리 할 때 이벤트에서 Handled 속성을 찾지 못했습니다. 동적마우스 휠이 winforms에서 버블 링합니까?

object.event += new EventHandler<EventArgs>(eventfunction); 

같은 이벤트를 작성하는 경우

많은 감사

+0

스크롤은 포커스가있는 항목에 영향을 받았을 뿐이며, 그 위에 커서를 가져 가면 안된다고 생각했습니다. – MPelletier

+0

@MPelletier 다르다. 예를 들어 Outlook에서 마우스를 가져 가면 Visual Studio에서 포커스가 있습니다 –

+0

MouseEnter 이벤트를 사용하여 사용자 컨트롤에 포커스를 둡니다. 이 방법은 내 초점을 맞춘 슬라이더 UserControl에 MouseWheel을 사용할 수 있습니다. 바퀴가 완벽하게 작동하지만 유일한 문제는 부모 패널이 동시에 스크롤된다는 것입니다. – Chris

답변

14

처럼 호출 된 후 이벤트를 등록 해제 시도 자신 만의 룩앤필 (look-and-feel)으로 완벽한 사용자 정의 사용자 정의 컨트롤 (UserControl 클래스를 상속).

UserControl이 속성 창에서 MouseWheel 이벤트를 표시하지 않는 것을 알 수 있습니다. 거기에 문제가 있음을 알았습니다. WM_MOUSEWHEEL 메시지가 울립니다. 포커스가있는 컨트롤이 처리하지 않으면 Windows는 해당 컨트롤을 부모로 전달합니다. 그것을 처리하기를 원하는 부모 창을 찾을 때까지 반복적으로. 네 사건의 패널.

슬라이더 컨트롤에서 약간의 흑 마법을 호출해야합니다. MouseWheel 이벤트에 전달 된 실제 이벤트 args는 이벤트 서명에서 알 수있는 MouseEventArgs 유형이 아니라 HandledMouseEventArgs입니다. 그럼 버블 링을 멈출 수 있습니다. 이와 같이 :

protected override void OnMouseWheel(MouseEventArgs e) { 
     base.OnMouseWheel(e); 
     // do the slider scrolling 
     //.. 
     ((HandledMouseEventArgs)e).Handled = true; 
    } 
+0

이봐, 너는 생명의 은인이야. 이것에 정말 감사드립니다. 내가 MS 문서에서 어디서나이 설명을 찾을 수 없다는 것을 혼란스럽게 느낀다. 어쩌면 내가 살펴봤을 까? – Chris

+0

그렇지 않았습니다. Control 대신 UserControl을 사용하면 문제가 발생합니다. –

0

는 eventfunction가 우리는 슬라이더 구현이

object.event -= new EventHandler<EventArgs>(eventfunction); 
관련 문제