所以我的应用程序有一个菜单表单,让我们称之为祖父母。用户单击一个按钮,它会调用另一个表单,让我们用form.show()将其称为父表单。因为我使用了show(),而不是showdialog(),所以我现在可以使用任何一种形式。
然后,在父表单中,我调用第三个表单,让我们用form.showdialog()将其称为child。我希望用户必须关闭子表单才能对父表单执行任何操作,这正是发生的事情。问题是,现在我也不能使用祖父母形式,它被锁定,直到我关闭子表单,我不希望它。
换句话说,我希望子表单是模态的,但仅限于父表单,而不是祖父表单。可以这样做吗?
答案 0 :(得分:3)
如果你可以忍受你父母和子女在另一个线程上生活的事实,那么你需要在另一个线程上使用控件时调用你可以启动第二个UI线程。父母表格......
当模态对话框阻塞父窗体UI线程的消息队列时,祖父母UI线程仍将拥有自己的非阻塞消息队列...
所以不要打电话
new ParentForm().Show();
祖父母形式电话代码中的某处
new System.Threading.Thread(
delegate() {
Application.Run(new ParentForm());
}
).Start();
答案 1 :(得分:0)
ShowDialog()会阻止UI线程,因此我认为不能轻易完成。您可以在新流程中启动子表单...但这非常激烈。
您可以手动禁用父窗体(禁用所有控件 - 将所有内容放在UserControl或Panel上,然后禁用它)。然后,如果用户碰巧点击父表单,说“请先关闭”,你就可以抛出一条消息。当子表单关闭时,重新启用父表单。
如果你想确保子表单保持可见,请设置TopMost属性,但要小心这样做,因为它可能会让用户感到烦恼。