我想在用户单击 System.Windows.Forms.Form 之外的任何地方时关闭它。我试过使用 IMessageFilter,但即便如此,也没有任何消息传递给 PreFilterMessage。如何在表单窗口外接收点击?
最佳答案
在表单的停用事件中,放置“this.Close()”。单击 Windows 中的任何其他位置后,您的表单将立即关闭。
更新:我想你现在拥有的是一个音量按钮,在 Click 事件中你创建了一个 VolumeSlider 表单的实例并通过调用 ShowDialog() 使其出现,它会阻塞直到用户关闭弹出的表单.在下一行中,您读取用户选择的卷并将其用于您的程序。
这没问题,但正如您所注意到的那样,它会强制用户明确关闭弹出窗口以返回到主程序。 Show() 是您真正想在弹出窗体上使用的方法,但 Show() 不会阻塞,这意味着主窗体上的 Click 事件在不知道新音量应该是什么的情况下完成。
一个简单的解决方案是在您的主窗体上创建一个公共(public)方法,如下所示:
public void SetVolume(int volume)
{
// do something with the volume - whatever you did before with it
}
然后,在您的“音量”按钮的 Click 事件中(也在主窗体上),您使 VolumeSlider 看起来像这样:
VolumeSlider slider = new VolumeSlider();
slider.Show(this); // the "this" is needed for the next step
在 VolumeSlider 表单中,当用户操作(我猜)滚动条时,您将这段代码放在滚动条的 ValueChanged 事件中(我认为就是这样):
MainForm owner = (MainForm)this.Owner;
owner.SetVolume(scrollbar.Value);
然后在 VolumeSlider 表单的 Deactivate 事件中,您将如上所述放置 this.Close()。然后您的表单将按预期运行。
关于c# - 当用户在窗体窗口外单击时如何关闭窗体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/298491/