【问题标题】:Show button when parent cursor in parent control当父光标在父控件中时显示按钮
【发布时间】:2013-05-21 03:30:29
【问题描述】:

对于我的应用程序中的组合框,我希望允许用户编辑控件绑定到的集合。为此,我希望有一个在光标位于控件上方时出现的按钮。因此,我创建了一个带有组合框和按钮的用户控件。但是,我在让按钮在正确的时间显示时遇到问题。这是我的代码:

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

所以我们的想法是,所有控件都将具有相同的鼠标进入/离开,因此当鼠标进入整个控件时,按钮将可见,而离开时将不可见。问题是鼠标离开事件在进入之前触发。因此,当您将鼠标移入控件时,该按钮变为可见。但是当您尝试移动到按钮时,无论光标在哪个控件上都会触发鼠标离开,并且在您“输入”它之前按钮变得不可见。有什么想法吗?

【问题讨论】:

  • 为什么不添加一些逻辑来知道鼠标是否真的在控件中?
  • 它不能正常工作的至少一个原因是您忘记了控件本身的进入/离开事件。闪烁的按钮不是那么漂亮,更好的方法是只使用 Enter 事件,然后启动一个 200 毫秒的计时器来检查鼠标是否不再在控件上方。
  • @HansPassant 抱歉,我确实也为父级绑定了该事件,它只是通过设计器完成的。不过我喜欢计时器的想法。
  • 我会说,提供一个成员变量来“记住”,该控件有鼠标。在 MouseEnter/MouseLeave 中不要做任何事情,除非这是您缓存的控件。如果是,请重置变量。在这种情况下,我不喜欢计时器的想法。

标签: c# .net


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我使用emd的建议在鼠标离开事件中检查鼠标是否在控件的边界内。

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

    这产生了我想要的结果。

    【讨论】:

      猜你喜欢
      • 2013-12-21
      • 2020-07-25
      • 2015-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多