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
相关产品推荐
相关产品推荐

