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

我想为禁用的button注册MouseEnter / MouseLeave事件。 它不工作allthough它启用button的工作..

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

它正在启用button…但如何做禁用button…我必须在mouseenter上显示工具提示操作,并立即在mouseleave上使其消失?

Solutions Collecting From Web of "在Windows窗体中注册MouseEnter / MouseLeave事件禁用控件?"

是的,当你禁用按钮,事件将被禁用。

你可以使用这个技巧:

把你的按钮放在panel1中, 在这里输入图像说明

然后对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); 

它会工作。

您可以尝试一些Form-wide Mouse message解决方案,如下所示:

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

你为什么不试试这个 ?

通过在窗体上添加MouseMove事件…

另外,如果你想维护事件处理的一个简单的方法,你可以永远不会实际上禁用按钮。 在按钮周围添加一些包装类,改变按钮的实现。

新的禁用属性可以改变按钮上的一些CSS,并改变一个属性,使得点击处理程序不做任何事情(或其他相关的事件)。

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

创建一个扩展UserControl的子类(只有基本控件的CustomControl)

那么不是将“Enabled”属性设置为false,而是创建一个只在其中禁用basecontrol而不是整个CustomControl的方法。

在CustomControl上设置工具提示仍然可以触发设置禁用basecontrol的eventhandlers。 这在任何使用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 

}