내 응용 프로그램의 내 콤보 상자의 경우 컨트롤이 바인딩 된 컬렉션을 사용자가 편집 할 수있게하려고합니다. 이렇게하려면 커서가 컨트롤 위에있을 때 나타나는 단추가 있어야합니다. 그래서, 나는 콤보 상자와 버튼이있는 사용자 정의 컨트롤을 만들었습니다. 그러나 적절한 시간에 버튼을 표시하는 데 문제가 있습니다. 여기 내 코드입니다 :상위 컨트롤에 부모 커서가있는 경우 단추 표시
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;
}
}
그래서 아이디어는 마우스 버튼이 표시 될 컨트롤의 전체를 입력하고 그것이 것 떠날 때 이렇게하면 모든 컨트롤 잎/같은 마우스가 입력하는 것이었다 보이지 않아야한다. 문제는 입력 전에 마우스를 놓는 이벤트가 시작된다는 것입니다. 따라서 마우스를 컨트롤 안으로 이동하면 버튼이 표시됩니다. 그러나 버튼으로 이동하려고 할 때 커서가 놓인 컨트롤이 무엇이든 마우스를 놓으면 버튼이 보이지 않게됩니다. 이견있는 사람?
왜 마우스가 실제로 컨트롤에 있는지 알 수있는 논리를 추가하지 않습니까? – emd
적어도 하나의 이유는 제대로 작동하지 않는 이유는 컨트롤 자체에 대한 입력/이탈 이벤트를 잊어 버렸기 때문입니다. 깜박이는 버튼은 그리 좋지 않습니다. 더 좋은 방법은 Enter 이벤트 만 사용하고 마우스가 더 이상 제어 할 수 없는지 확인하는 200msec 타이머를 시작하는 것입니다. –
@HansPassant 죄송합니다. 부모님을위한 이벤트도 디자이너에게만 전해드립니다. 나는 타이머 아이디어를 좋아한다. – Nick