假设我有以下任务。
有一个主要的申请表,有许多按钮;当您单击其中每个按钮时,您将再获得一个表单。第二次单击按钮应关闭打开的表单。
这些表单不应显示在任务栏中,因为它们是辅助的。它们不应该是对话框,因为它会阻止主应用程序表单,并阻止用户使用主窗口或其他形式(如打开的窗体)执行其他操作。它们应该显示在主窗体上方,但不能高于其他窗口(因此TopMost不适合)。当这些表格关闭时,应通知主表格,当主表格最小化时,也应将其最小化。
你会如何解决这个问题?
目前的解决方案基于使用钩子。它不是很容易理解,也很难维护(主要是因为我在win32中没有经验)。它适用于大约90%的情况,但在10%情况下没有。
也许,表单行为的要求是严格的?
答案 0 :(得分:1)
我建议使用一些窗口管理器,因此每个按钮都会告诉窗口管理器切换窗体X的可见性,如果X不存在则会显示,如果是,它将被关闭。 您应该能够配置窗口,使它们不会显示在任务栏中。 为了能见度,我不确定你的意思。当您通过按钮打开表单时,它通常会转到前面,这应该没问题。如果你切换窗口那么,你期待什么?主窗口应该始终保持在后台还是在聚焦时可以到达前面? 每当我看到应用程序改变这些标准行为时,它们都会以某种方式失败。无论是错误的窗口出现还是有些都无法访问,或者用户只是感到困惑,因为这些窗口并不像所有其他窗口那样。
答案 1 :(得分:0)
以下是您的大部分要求的实现方式:
MSDN Quote:
当表单由另一个表单拥有时, 它与业主关闭或隐藏 形成。例如,考虑一个表格 名为Form2的表单 命名为Form1。如果Form1关闭或 最小化,Form2也关闭或 隐。拥有的表格也永远不会 显示在所有者表格后面。您 可以使用窗口的自有窗体 作为查找和替换窗口,其中 当主人不应该消失 表格被选中。确定 父表单拥有的表单, 使用OwnedForms属性。
答案 2 :(得分:0)
这不是问题。使用Show(owner)重载来显示表单。
拥有的表单始终位于其所有者之上。最小化主窗口时,它会自动最小化。不需要ShowInTaskbar。 winforms支持的另一个窗口模型是MDI,请查看MdiParent属性。子窗口被限制在主窗口的边界内。另外考虑使用UserControls而不是表单,您可以根据需要交换它们。或者使用TabControl选项卡式界面。 Weifenluo的DockPanel套件是Visual Studio样式窗口模型的一种非常流行的实现,支持可以在主窗口中停靠和浮动的窗口。这里有很多选择:)