2013-05-20 3 views
0

내 응용 프로그램의 내 콤보 상자의 경우 컨트롤이 바인딩 된 컬렉션을 사용자가 편집 할 수있게하려고합니다. 이렇게하려면 커서가 컨트롤 위에있을 때 나타나는 단추가 있어야합니다. 그래서, 나는 콤보 상자와 버튼이있는 사용자 정의 컨트롤을 만들었습니다. 그러나 적절한 시간에 버튼을 표시하는 데 문제가 있습니다. 여기 내 코드입니다 :상위 컨트롤에 부모 커서가있는 경우 단추 표시

public partial class CollectionDropDown : UserControl 
    { 
     public CollectionDropDown() 
     { 
      InitializeComponent(); 
      SetEventsRecursively(Controls); 
     } 

     public void SetEventsRecursively(ControlCollection controls) 
     { 
      foreach (Control ctrl in controls) 
      { 
       ctrl.MouseLeave += new EventHandler(ctrl_MouseLeave); 
       ctrl.MouseEnter += new EventHandler(ctrl_MouseEnter); 
       SetEventsRecursively(ctrl.Controls); 
      } 
     } 

     void ctrl_MouseEnter(object sender, EventArgs e) 
     { 
      button1.Visible = true; 
     } 

     void ctrl_MouseLeave(object sender, EventArgs e) 
     { 
      button1.Visible = false; 
     } 
    } 

그래서 아이디어는 마우스 버튼이 표시 될 컨트롤의 전체를 입력하고 그것이 것 떠날 때 이렇게하면 모든 컨트롤 잎/같은 마우스가 입력하는 것이었다 보이지 않아야한다. 문제는 입력 전에 마우스를 놓는 이벤트가 시작된다는 것입니다. 따라서 마우스를 컨트롤 안으로 이동하면 버튼이 표시됩니다. 그러나 버튼으로 이동하려고 할 때 커서가 놓인 컨트롤이 무엇이든 마우스를 놓으면 버튼이 보이지 않게됩니다. 이견있는 사람?

+1

왜 마우스가 실제로 컨트롤에 있는지 알 수있는 논리를 추가하지 않습니까? – emd

+1

적어도 하나의 이유는 제대로 작동하지 않는 이유는 컨트롤 자체에 대한 입력/이탈 이벤트를 잊어 버렸기 때문입니다. 깜박이는 버튼은 그리 좋지 않습니다. 더 좋은 방법은 Enter 이벤트 만 사용하고 마우스가 더 이상 제어 할 수 없는지 확인하는 200msec 타이머를 시작하는 것입니다. –

+0

@HansPassant 죄송합니다. 부모님을위한 이벤트도 디자이너에게만 전해드립니다. 나는 타이머 아이디어를 좋아한다. – Nick

답변

0

emd의 제안을 사용하여 마우스가 마우스 나가기 이벤트의 컨트롤 범위 내에 있는지 확인했습니다.

if (!this.RectangleToScreen(ClientRectangle).Contains(Cursor.Position)) 
       button1.Visible = false; 

결과가 좋았습니다.

0

다음과 같이 시도해보십시오. 구문이 올바른지 확실하지 않습니다.

Control ctrl = null; 
    void ctrl_MouseEnter(object sender, EventArgs e) 
    { 

     If (ctrl == null) 
     { 
      button1.Visible = true; 
      ctrl = sender; 
     } 
    } 

    void ctrl_MouseLeave(object sender, EventArgs e) 
    { 

     If (ctrl != null && ctrl.Equals(sender)) 
     { 
      button1.Visible = false; 
      ctrl = null; 
     } 
    } 
관련 문제