【问题标题】:Controlling many forms at the same time同时控制多种形式
【发布时间】:2010-10-17 05:26:29
【问题描述】:

假设,我有以下任务。

有一个带有许多按钮的主申请表;当您单击这些按钮中的每一个时,您会得到一个表格。第二次单击该按钮应关闭打开的表单。

这些表单不应该显示在任务栏中,因为它们是辅助的。它们不应该是对话框,因为这会阻塞主应用程序表单并阻止用户对主窗口或其他表单(如打开的表单)执行一些其他操作。它们应该显示在主窗体上方,而不是其他窗口上方(因此 TopMost 不包含)。当此类表单关闭时,应该通知主表单,当主表单最小化时,它们也应该被最小化。

你会如何解决这个问题?

当前的解决方案是基于使用钩子。不是很容易理解,也很难维护(主要是我对win32没有经验)。它适用于大约 90% 的情况,但在 10% 的情况下不能。

也许,对表单行为的要求太严格了?

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

    我会推荐使用一些窗口管理器,所以每个按钮都会告诉窗口管理器切换表单 X 的可见性,如果 X 不存在,它将被显示,如果存在,它将被关闭。 您应该能够配置窗口,使其不会显示在任务栏中。 对于可见性,我不确定您的意思。当您通过按钮打开表单时,它通常会转到最前面,这应该没问题。如果你切换窗口,你会期待什么?主窗口应该始终留在背景中还是在聚焦时允许它出现在前面? 每当我看到应用程序更改此类标准行为时,它们都会以某种方式失败。要么出现了错误的窗口,要么有些窗口无法再访问,或者用户只是因为这些窗口的行为与所有其他窗口不同而感到困惑。

    【讨论】:

      【解决方案2】:

      这不是问题。使用 Show(owner) 重载来显示表单。

      拥有的表单始终位于其所有者之上。当您最小化主窗口时,它会自动最小化。不需要 ShowInTaskbar。 winforms 支持的另一个窗口模型是 MDI,查看 MdiParent 属性。子窗口被限制在主窗口的范围内。还可以考虑使用 UserControls 而不是表单,您可以根据需要将它们换入和换出。或选项卡式界面,使用 TabControl。 Weifenluo 的 DockPanel 套件是非常流行的 Visual Studio 风格窗口模型的实现,支持可以停靠和浮动在主窗口中的窗口。这里有很多选择:)

      【讨论】:

      • 我的事件不知道所有者...似乎这是一个很好的解决方案。
      【解决方案3】:

      您可以通过以下方式满足您的大部分要求:

      • 将每个子窗体的Owner 设置为主窗体。

      MSDN 引用:

      当一个表单被另一个表单拥有时, 它与所有者关闭或隐藏 形式。例如,考虑一个表格 名为 Form2 的表单拥有 命名为 Form1。如果 Form1 已关闭或 最小化,Form2 也关闭或 隐。拥有的表格也永远不会 显示在他们的所有者表格后面。你 可以为 Windows 使用拥有的表单,例如 作为查找和替换窗口,其中 主人不应该消失的时候 表格被选中。确定 由父表单拥有的表单, 使用 OwnedForms 属性。

      • 要阻止表单出现在任务栏中,您需要设置 ShowInTaskBar 属性

      【讨论】:

        猜你喜欢
        • 2016-05-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-25
        • 1970-01-01
        相关资源
        最近更新 更多