Зарегистрировать события MouseEnter/MouseLeave для отключенных элементов управления в форме Windows?

Я хочу зарегистрировать события MouseEnter/MouseLeave для отключенных кнопок. Это не работает, хотя это работает для включенных кнопок..

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

Она работает для кнопки включения... но что делать для кнопки отключения... Я должен показать операцию всплывающей подсказки при вводе мыши и сразу же отключить ее при отпускании мыши?

5 ответов

Да, когда вы отключите кнопку, события будут отключены.

Вы можете использовать этот трюк:

вставьте свою кнопку в панель 1,введите описание изображения здесь

затем используйте то же событие кнопки для панели 1. как это:

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

В качестве альтернативы, если вы хотите простой способ поддержки обработки событий, вы можете просто никогда не отключить кнопку. Добавьте некоторый класс обертки вокруг кнопки, которая меняет реализацию ваших кнопок.

Новое свойство disable может просто изменить некоторые CSS на кнопке и изменить свойство, которое заставит обработчик щелчка ничего не делать (или другие соответствующие события).

Почему ты не можешь попробовать это?

Добавляя событие MouseMove в форму...

Я пробовал много, но в итоге использовал этот простой трюк, который, я думаю, более эффективен.

Создайте подкласс (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

}

Другие вопросы по тегам