4

我想为禁用的按钮注册 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";
        }

它适用于启用按钮...但是禁用按钮该怎么办...我必须在 mouseenter 上显示工具提示操作并使其在 mouseleave 上立即消失?

4

5 回答 5

5

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

你可以使用这个技巧:

将您的按钮放在 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);

它会起作用的。

于 2013-10-10T07:53:43.303 回答
1

您可以尝试一些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;
    }
}
于 2013-10-10T11:23:41.717 回答
0

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

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

于 2013-10-10T19:27:25.447 回答
0

你为什么不能试试这个

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

于 2013-10-10T09:08:58.743 回答
0

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

创建一个扩展 UserControl 的子类(仅包含基本控件的 CustomControl)

然后,不要将“启用”属性设置为 false,而是创建一个仅禁用其中的 basecontrol 而不是整个 CustomControl 的方法。

在 CustomControl 上设置工具提示仍然能够触发事件处理程序,将 basecontrol 设置为禁用。这适用于使用 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

}

于 2015-10-29T17:12:43.127 回答