Registra gli eventi MouseEnter / MouseLeave per i controlli disabilitati in forma di windows?

Voglio registrare eventi MouseEnter / MouseLeave per i pulsanti disabilitati. Non funziona sebbene funzioni per i pulsanti abilitati ..

//Enable Disable controls on form load EnableDisableControls("Load"); var grupButtons = control.Controls.OfType

Funziona per il pulsante di triggerszione … ma cosa fare per il pulsante di distriggerszione … Devo mostrare l’operazione del tooltip su mouseenter e farlo scomparire immediatamente su mouseleave?

sì, quando disabiliti il ​​pulsante, gli eventi verranno disabilitati.

puoi usare questo trucco:

inserisci il tuo pulsante in panel1, inserisci la descrizione dell'immagine qui

quindi utilizzare lo stesso evento del pulsante per panel1. come questo:

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

Funzionerà.

Puoi provare una soluzione di Form-wide Mouse message come questa:

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

Perché non puoi provare questo ?

Aggiungendo l’evento MouseMove nel modulo …

In alternativa, se si desidera un modo semplice per mantenere la gestione degli eventi, non si può semplicemente disabilitare il pulsante. Aggiungi una sorta di class wrapper attorno a un pulsante che modifica l’implementazione dei pulsanti.

La nuova proprietà disable potrebbe solo modificare alcuni CSS sul pulsante e modificare una proprietà che farebbe sì che il gestore dei clic non faccia nulla (o altri eventi rilevanti).

Ho provato molti ma ho finito per usare questo semplice trucco che penso sia più efficace.

Creare una sottoclass (CustomControl con solo controllo di base in esso) che estende UserControl

quindi invece di impostare la proprietà “Enabled” su false crea un metodo che disabilita solo basecontrol in esso invece di intero CustomControl.

Impostando il suggerimento su CustomControl sarà ancora ansible licenziare i gestori di eventi che disabilitano il controllo di base. Funziona ovunque sia utilizzato CustomControl piuttosto che la codifica su ogni modulo utilizzato.

Ecco il suggerimento .. 🙂

 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 

}