【问题标题】:C# Detect if Form is in the "Background" / Invisible (for the User)C# 检测表单是否在“背景”/不可见(对于用户)
【发布时间】:2018-11-14 06:59:43
【问题描述】:

我们有一些没有边框/没有工具箱(覆盖)的表单

每当用户点击底层窗口中的其他位置时,覆盖表单就会发送到后台(常规的非模态表单行为)

是否有一个事件,所以“覆盖”可以检测到它的可见性变化并自行关闭?

也许它可以在 resize/paint 事件中处理,在哪里可以捕捉到“隐形”?


背景: 典型的“选择或创建”用例。单击“加号”显示微小的创建形式。目前它是“最上面的”,所以用户需要点击“Escape”来摆脱它。 (否则会有一堆“背景覆盖”,因此问题)

如果点击其他东西关闭“小表单”会更“用户友好”:


【问题讨论】:

  • Form.Deactivate?
  • @TnTinMn Form.Deactivate!
  • 将弹出表单更改为TopLevel = false;并尝试使用此示例:How to create drop down information box in C# Winforms?
  • @LarsTech 是的,ofc。它不再是“TopLevel”。这只是一种解决方法,以避免在用户单击“其他地方”时将大量叠加层发送到后台。
  • 我认为你错过了我的观点。当用户单击其他位置时,使用 ToolStripControlHost 的弹出控件将为您关闭弹出窗口。它也不会停用您的主窗体。

标签: c# winforms


【解决方案1】:

您可以使用表单的Deactivate事件:

private void Form1_Deactivate(object sender, EventArgs e)
{
    Visible = false;
}

【讨论】:

  • 谢谢,似乎错过了显而易见的事情。
  • @dognose,发生这种情况,虽然我已经多次使用这个事件(很久以前)我打开了一个新的winform项目并查看了事件,因为虽然我知道它在那里但我没有记住它是什么;)
  • @dognose 而不是Visible = false;,您可能想要执行Opacity = .5; 之类的操作,以便仍然可以看到表单(并再次重新激活,您将在其中设置Opacity = 1;
  • 还检查了所有事件,但在 VisibleChanged 刚刚对 this.visible=x 做出反应之后 - 我预计 Disabled 也需要明确设置 this.enabled=false :-)
  • @RufusL 这只是为了展示这个事件,而 dognose 是一位经验丰富的程序员,正如他的代表所显示的那样,他会掌握它的。我实际上是因为这个设置了可见性:**是否有一个事件,所以“覆盖”可以检测到它的可见性变化并自行关闭**
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-16
  • 2012-11-24
  • 1970-01-01
相关资源
最近更新 更多