c# - 鼠标进入/离开Form和Button子事件问题

标签 c# winforms forms button events

有一个在鼠标离开事件时淡出的程序。

但问题是当鼠标进入像 Button 这样的窗体的子级时,它会触发鼠标离开事件。所以我设置了这段代码。

private void Form1_MouseLeave(object sender, EventArgs e)
{
    if (this.ClientRectangle.Contains(this.PointToClient(Cursor.Position)))
    {
        this.Opacity = 1.0;
    }
    else
    {
        int loopctr = 0;

        for (loopctr = 100; loopctr >= 5; loopctr -= 10)
        {
            this.Opacity = loopctr / 99.0;
            this.Refresh();
            Thread.Sleep(100);
        }
    }
}

但现在的问题是表单经常不会触发鼠标离开事件,看起来是因为按钮太靠近表单边缘以至于它永远不会注册鼠标离开表单边界,可能是因为鼠标光标是为了快速并在它离开时跳过表格。

关于如何处理这个有什么建议吗?

最佳答案

这是一个简单的实用程序类来执行此操作,首先像这样在您的表单中使用它:

partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        new FadeForm(this, TimeSpan.FromSeconds(5), TimeSpan.FromSeconds(0.25), 0.05);
    }
}

然后将此代码添加到您的项目中:

class FadeForm
{
    readonly Form _top;
    readonly Timer _timer;
    readonly TimeSpan _delayToFade;
    readonly double _fadeAmount;

    Control _lastControl;
    DateTime _lastActivity;

    public FadeForm(Form ctrl, TimeSpan delayToFade, TimeSpan delaySpeed, double fadeAmount)
    {
        _top = ctrl;
        _delayToFade = delayToFade;
        _fadeAmount = fadeAmount;
        _lastActivity = DateTime.Now;

        WatchControl(_top);

        _timer = new Timer();
        _timer.Interval = (int)delaySpeed.TotalMilliseconds;
        _timer.Enabled = true;
        _timer.Tick += new EventHandler(Tick);
    }

    void  Tick(object sender, EventArgs e)
    {
        if (_lastControl != null || (DateTime.Now - _lastActivity) < _delayToFade)
        {
            if (_top.Opacity != 1)
                _top.Opacity = 1;
        }
        else
        {
            double newvalue = _top.Opacity -= _fadeAmount;
            if (newvalue > 0.0)
                _top.Opacity = newvalue;
            else
                _top.Close();
        }
    }

    void WatchControl(Control c)
    {
        c.MouseEnter += new EventHandler(MouseEnter);
        c.MouseLeave += new EventHandler(MouseLeave);
    }

    void MouseEnter(object sender, EventArgs e)
    {
        _lastControl = sender as Control;
    }

    void MouseLeave(object sender, EventArgs e)
    {
        _lastControl = null;
        _lastActivity = DateTime.Now;
    }
}

关于c# - 鼠标进入/离开Form和Button子事件问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1460508/

相关文章:

c# - 对 EntityFramework 和 "normal"SQL 调用使用相同的 SqlConnection

c# - 设计 View 未在 Visual Studio 2015 中打开

forms - 如何在JSP中禁用下拉列表?

regex - 为什么我不能更改 RichTextBox 中重复单词的颜色?

c# - 如何在设计时在窗体上绘画?

用于 Web 应用程序的带十进制的 iPhone 数字小键盘?

php - 为什么我的表单值没有添加到 mysql/以及如何在计算时获得 2 位小数

c# - 如何检查/反汇编 Visual Studio 扩展

c# - 找到一个 HtmlGenericControl

c# - 字符串?对于 C# 中的方法