当父光标在父控件中时显示按钮

本文关键字:显示 按钮 控件 光标 | 更新日期: 2023-09-27 18:14:22

对于应用程序中的组合框,我希望允许用户编辑控件绑定到的集合。要做到这一点,我希望有一个按钮,当光标在控件上时显示。我创建了一个用户控件,上面有一个组合框和一个按钮。然而,我有一个问题,让按钮显示在正确的时间。下面是我的代码:

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;
        }
    }

所以我们的想法是所有的控件都有相同的鼠标进入/离开,所以当鼠标进入整个控件时,按钮将是可见的,当它离开时,按钮将是不可见的。问题是鼠标离开事件在进入之前触发。因此,当您将鼠标移动到控件中时,按钮将变得可见。但是当你试图移动到按钮上时,无论光标在哪个控件上,鼠标都会离开,在你"输入"按钮之前,按钮就会变得不可见。任何想法吗?

当父光标在父控件中时显示按钮

试试这样做。我不确定语法是否正确

    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; 
        }
    }

我使用emd的建议来检查鼠标是否在鼠标离开事件的控件范围内。

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

生成我想要的结果