c# .net winforms 中的自定义工具提示

custom tooltip in c# .net win forms

我正在寻找模拟自定义工具提示,就像您在使用 c# .NET 4.5 的网站上看到的一样 windows forms.This 工具提示基本上会显示某些任务的状态,例如有多少任务待处理,任务进行中,已完成 etc.To 这样做我正在使用无边界 win form.This winform 将有一些文本、图像 etc.I 希望它在按钮的 mouseHover 事件上显示自己并在 MouseLeave 上消失 event.My 问题是在 Mousehover 事件上生成了该工具提示表单的许多实例,而在 MouseLeave 上它们没有得到 closed.My 代码是

        private void B_MouseHover(object sender, EventArgs e)
    {
        frmSecQStatToolTipDlg tooltip = new frmSecQStatToolTipDlg();
        tooltip.Location = this.PointToScreen(new Point(this.Left, this.Bottom));
        tooltip.Show();
    }

private void B_MouseLeave(object sender, EventArgs e)
    {
        frmSecQStatToolTipDlg tooltip = new frmSecQStatToolTipDlg();
        tooltip.Close();
    }

我的代码不起作用,因此请告诉我如何正确执行此操作way.Thanks

您应该为此表单保留一个全局字段,而不应该 disposeclose 它。只是 hide 它在一些事件和 show 再次。

示例代码:

frmSecQStatToolTipDlg tooltip;

private void B_MouseHover(object sender, EventArgs e)
{
    if(frmSecQStatToolTipDlg == null)
    {
        tooltip = new frmSecQStatToolTipDlg();
    }

    tooltip.Location = this.PointToScreen(new Point(this.Left, this.Bottom));
    tooltip.Show();
}

private void B_MouseLeave(object sender, EventArgs e)
{
    if(frmSecQStatToolTipDlg != null)
    {
        tooltip.Hide();
    }
}

有了这个逻辑,你就不必一次又一次地创建 tooltip 实例,如果你经常这样做,弹出窗口也不会花时间 activity。

每次您收到悬停事件和每次收到离开事件时,您都会生成表单 class 的新实例。如果您想继续使用这种方法,我建议您在主窗体对象上使用一个变量来存储对工具提示窗体的引用。其次,您不需要在调用事件处理程序时生成新实例,而是仅在必要时才生成。我会在第一次为特定控件调用 Hover 事件时创建您的实例,然后在调用 Leave 处理程序时处理它——这是假设工具提示对话框的构造函数为悬停的每个控件加载不同的信息超过。像这样:

frmSecQStatToolTipDlg f_tooltip;

private void B_MouseHover(object sender, EventArgs e)
{
    if(frmSecQStatToolTipDlg == null)
    {
        f_tooltip = new frmSecQStatToolTipDlg();
    }

    tooltip.Location = this.PointToScreen(new Point(this.Left, this.Bottom));
    tooltip.Show();
}

private void B_MouseLeave(object sender, EventArgs e)
{
    if(f_tooltip != null)
    {
        f_tooltip.Close();
        f_tooltip = null;
    }
}

将您的工具提示声明一次为只读,并随时使用它而不询问它是否为空。 如果您需要处置它,请实施 IDisposable 模式: https://msdn.microsoft.com/en-us/library/b1yfkh5e(v=vs.110).aspx

private readonly frmSecQStatToolTipDlg _tooltip = new frmSecQStatToolTipDlg() ;

private void B_MouseHover(object sender, EventArgs e)
{    
    _tooltip.Location = this.PointToScreen(new Point(this.Left, this.Bottom));
    _tooltip.Show();
}

private void B_MouseLeave(object sender, EventArgs e)
{
    _tooltip.Hide();
}