【问题标题】:Problems bringing other forms to front in a form's Activated event在表单的激活事件中将其他表单置于前面的问题
【发布时间】:2023-03-30 04:18:01
【问题描述】:

我想要一个 MainForm 将另外两个单独的表单带到前面,只要它本身被带到前面。我正在使用 MainForm 的 Activated 事件处理程序来执行此操作,但是将其他两个表单放在前面并将焦点返回到 MainForm 会导致问题:

    private void MainForm_Activated(object sender, EventArgs e)
    {
        tilemapForm.BringToFront();
        tilesetForm.BringToFront();
        this.BringToFront();
        this.Focus();
    }

每当触发此事件时,所有三个表单的标题栏文本都会消失,并且表单会在完成前疯狂闪烁几秒钟。

删除 this.Focus() 会修复它,但随后会禁用 MainForm 的控制框,因此无法通过控制框最小化或关闭它。有没有办法解决这个困境?

【问题讨论】:

  • 这是什么类型的应用程序?您如何创建/显示您的两个附加表单,如果您在主表单中创建它们,请尝试将主表单添加为 tilemapForm.Show(this) 中的拥有表单。
  • 因为您的代码停用了 Mainform...
  • 谢谢马克,这正是我想要做的。我不希望 tilemapForm 和 tilesetForm 位于 MainForm 的绘图区域内,即子窗体,但我希望它们在大多数其他方面被视为子窗体。似乎将两个表单的 Owner 属性设置为 MainForm 就是这样做的。
  • @MarkHall 应该设置答案以关闭此线程。

标签: c# winforms focus


【解决方案1】:

Windows 窗口管理器内置了特定的对策来阻止您的程序崩溃。没有它们,您的代码注定会因该网站的名称而崩溃。由于您正在编写导致 Activate 事件再次引发的代码,因此递归将破坏堆栈并使用 StackOverflowException 使您的应用程序崩溃。

它所做的一件事是在触发 WM_ACTIVATE 消息时完全忽略任何将另一个窗口移动到前台的尝试。这是您自己发现的,因此您决定使用 Focus() 方法强制激活窗口。

不能轻易击败 Windows,它也有应对措施。它将尝试最多 32 次来满足您的请求。这就是你所看到的,窗口正在疯狂地来回交换,直到 Windows 在它决定你的程序陷入无限循环时停止它。这些是导致非常不愉快结果的常见编程错误,堆栈溢出很难诊断。

解决方法很简单,您需要一个拥有的窗口。拥有的窗口始终显示在其所有者之上,并与所有者一起被最小化。对于工具窗口和对话框非常常见。

使用Show(owner) overload 显示这些工具窗口并删除Activated 事件处理程序。

【讨论】:

    【解决方案2】:

    发表评论作为答案。

    这是什么类型的应用程序?
    您如何创建/显示您的另外两个表单?

    当您使用Show(IWin32Window) 方法在主窗体中创建主窗体时,尝试将主窗体添加为拥有窗体,如tilemapForm.Show(this)。通过这样做,它将设置表单的 Owner 属性(您也可以稍后通过直接在表单上设置属性来做到这一点),通过第二个链接的引用将为您提供您的结果想要:

    当一个表单被另一个表单拥有时,它会与所有者表单一起关闭或隐藏。例如,考虑一个名为 Form2 的表单,它由名为 Form1 的表单拥有。如果 Form1 被关闭或最小化,Form2 也被关闭或隐藏。拥有的表单也永远不会显示在其拥有者表单的后面。 You can use owned forms for windows such as find and replace windows, which should not disappear when the owner form is selected.要确定父表单拥有的表单,请使用 OwnedForms 属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-19
      • 1970-01-01
      • 2012-10-07
      • 2014-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多