You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FormClosed事件是否在窗体关闭后触发?自定义Tooltip显示异常排查

问题分析与解决方案

问题核心

你遇到的是WinForm中FormClosed事件的触发时机问题:该事件在窗体开始关闭流程时就会触发,而非完全消失后。此时NewForm仍处于视觉可见状态,导致你的自定义ToolTip无法正常显示(因存在上层窗体遮挡或层级问题)。

现有代码梳理

OldForm(UserControl)代码

public partial class OldForm: UserControl
{
    public OldForm(FocusMoreMenu myFocusMore)
    {
        InitializeComponent();
    }
    private void createNewForm(object sender, EventArgs e)
    {
        NewForm newForm = new NewForm (this);
        newForm.Show();
    }
    public void handleCloseEvent(object sender, FormClosedEventArgs e) 
    {
         CustomToolTip notifyError = new CustomToolTip();
         notifyError.Show("Some notification ", this, Xposition, Yposition, 2000);
    }
}

NewForm代码

public partial class NewForm : Form
{
    OldForm oldFormObject;

    public NewForm(OldForm oldFormObject)
    {
        this.oldFormObject = oldFormObject;
        InitializeComponent();
        this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(oldFormObject.handleCloseEvent);
    }
    
    private void closeButton(object sender, EventArgs e)
    {
        oldFormObject.passedVariable = someTextBox.Text;
        this.Close();
    }
}

解决办法

方法1:延迟ToolTip显示

利用异步延迟,等待窗体完全关闭后再显示ToolTip,修改handleCloseEvent方法即可:

public async void handleCloseEvent(object sender, FormClosedEventArgs e) 
{
     await Task.Delay(100); // 等待窗体关闭的短暂间隙(可根据实际调整时长)
     CustomToolTip notifyError = new CustomToolTip();
     notifyError.Show("Some notification ", this, Xposition, Yposition, 2000);
}

方法2:让ToolTip置顶显示

如果你的CustomToolTip支持设置TopMost属性,直接将其设为true,强制ToolTip显示在所有窗体上层:

public void handleCloseEvent(object sender, FormClosedEventArgs e) 
{
     CustomToolTip notifyError = new CustomToolTip();
     notifyError.TopMost = true; // 假设CustomToolTip具备该属性
     notifyError.Show("Some notification ", this, Xposition, Yposition, 2000);
}

方法3:改用主窗体作为ToolTip载体

将ToolTip的显示目标从UserControl改为主窗体,避免UserControl的层级问题:

// 在OldForm中添加获取主窗体的属性
private Form MainForm => this.FindForm();

public void handleCloseEvent(object sender, FormClosedEventArgs e) 
{
     CustomToolTip notifyError = new CustomToolTip();
     // 计算相对于主窗体的位置
     Point screenPos = this.PointToScreen(new Point(Xposition, Yposition));
     Point formPos = MainForm.PointToClient(screenPos);
     notifyError.Show("Some notification ", MainForm, formPos.X, formPos.Y, 2000);
}

内容的提问来源于stack exchange,提问作者Meric Ozcan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 06:35:29