在Windows窗体中为禁用的控件注册MouseEnter/MouseLeave事件?

4

我想要为禁用的按钮注册鼠标进入/离开事件。虽然对于启用的按钮可以正常工作,但对于禁用的按钮不起作用。

//Enable Disable controls on form load
                EnableDisableControls("Load");

var grupButtons = control.Controls.OfType<Button>();
                    foreach (Button btns in grupButtons)
                    {
                        //btns.MouseMove += new MouseEventHandler(MainframeDataExchangeTool_MouseMove);
                        btns.MouseEnter += new EventHandler(btns_MouseEnter);
                        btns.MouseLeave += new EventHandler(btns_MouseLeave);
                    }

private void btns_MouseEnter(object sender, EventArgs e)
        {

        }

        private void btns_MouseLeave(object sender, EventArgs e)
        {
            var parent = sender as Control;
            string tipstring = string.Empty;
            if (parent == null)
            {
                return;
            }
            string enter = sender.GetType().ToString() + ": MouseEnter";
        }

它适用于启用按钮...但对于禁用按钮应该怎么做...我需要在鼠标进入时显示工具提示操作,并使其在鼠标离开时立即消失?


设置按钮的 ToolTip 属性不起作用吗? - Thorsten Dittmar
尝试使用 tooltip 属性来为按钮添加提示,而不是在事件中进行操作。 - Saghir A. Khatri
在 Windows 表单中没有工具提示属性...如果您能给一个例子会更好。 - Rahul Chowdhury
如果您在按钮显示工具提示时禁用了它,那么肯定会出现问题。我认为这是一个无法解决的问题,您必须避免这种情况发生。 - Hans Passant
5个回答

5

是的,当你禁用按钮时,事件也会被禁用。

你可以使用这个技巧:

将你的按钮放在panel1中, enter image description here

然后使用相同的按钮事件来控制panel1。像这样:

    btns.MouseEnter += new EventHandler(btns_MouseEnter);
    btns.MouseLeave += new EventHandler(btns_MouseLeave);

    panel1.MouseEnter += new System.EventHandler(btns_MouseEnter);
    panel1.MouseLeave += new System.EventHandler(btns_MouseLeave);

它将会工作。


Hossein Razaei...即使工作正常,但当我进入GroupBox时它会被触发...我已经在其中使用了GroupBox和按钮...但我希望事件在我进入按钮并离开它时被触发...感谢您的帮助。 - Rahul Chowdhury

2

您可以尝试像这样的一些 表单宽鼠标消息 解决方案:

//Suppose your disabled Button is button1
public partial class Form1 : Form, IMessageFilter
{
    public Form1()
    {
        InitializeComponent();
        button1.Enabled = false;
        button1.BackColor = Color.Green;
        //Try this to see it in action
        button1.MouseEnter += (s, e) => {
            button1.BackColor = Color.Red;
        };
        button1.MouseLeave += (s, e) => {
            button1.BackColor = Color.Green;
        };
        Application.AddMessageFilter(this);//Add the IMessageFilter to the current Application
    }
    bool entered;
    public bool PreFilterMessage(ref Message m)
    {
        if (m.Msg == 0x200) //WM_MOUSEMOVE = 0x200
        {
            if (Control.FromHandle(m.HWnd) == button1.Parent && 
                button1.ClientRectangle.Contains(button1.PointToClient(MousePosition)))
            {
                if (!entered) {
                    entered = true;
                    //Raise the MouseEnter event via Reflection
                    typeof(Button).GetMethod("OnMouseEnter", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)
                        .Invoke(button1, new[] { EventArgs.Empty });
                }                    
            }
            else if (entered) {
                //Raise the MouseLeave event via Reflection
                typeof(Button).GetMethod("OnMouseLeave", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)
                    .Invoke(button1, new []{EventArgs.Empty});
                entered = false;                    
            }
        }
        return false;
    }
}

0

我尝试了很多方法,最终使用了这个简单的技巧,我认为它更有效。

创建一个子类(CustomControl),其中只包含基本控件,并将其扩展为UserControl。

然后,不要将“Enabled”属性设置为false,而是创建一个方法,在其中仅禁用基本控件,而不是整个CustomControl。

在CustomControl上设置工具提示仍然可以触发事件处理程序,从而设置基本控件为禁用状态。这适用于CustomControl在任何使用中,而不是在每个表单上编码。

这就是提示.. :)

public partial class MyTextBox : UserControl
{
 ...
 ...
 ...


 public void DisableMyTextBox()
  {
    this.txt.Enabled = false;  //txt is the name of Winform-Textbox from my designer
    this.Enabled = true;
  }

public void EnableMyTextBox()
  {
    this.txt.Enabled = true;
    this.Enabled = true;
  }

//set the tooltip from properties tab in designer or wherever

}


0

为什么不试试this呢?

通过在表单上添加MouseMove事件...


0

或者,如果您想要一种简单的方式来维护事件处理,您可以只是从未真正禁用该按钮。在按钮周围添加某种包装类,以更改您的按钮实现。

新的禁用属性仅需更改按钮上的一些CSS并更改一个属性,使单击处理程序不执行任何操作(或其他相关事件)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接