如何在使用c#?
激活子表单时禁用父表单答案 0 :(得分:182)
您是否尝试过使用Form.ShowDialog()代替Form.Show()?
ShowDialog将您的窗口显示为模态,这意味着在关闭之前您无法与父窗体进行交互。
答案 1 :(得分:37)
您是否通过父表单在您的子表单上调用ShowDialog()
或Show()
?
ShowDialog
将“阻止”用户与作为参数传递给ShowDialog
的表单进行交互。
在父母中你可以称之为:
MyChildForm childForm = new MyChildForm();
childForm.ShowDialog(this);
其中this
是父表单。
答案 2 :(得分:15)
简单,使用
Form.ShowDialog();
相反
Form.Show();
使用Form.ShowDialog()
时,在关闭之前,您无法与父表单进行交互。
答案 3 :(得分:10)
您可以做的是确保在显示子表单时将父表单作为所有者传递:
Form newForm = new ChildForm();
newForm.Show(this);
然后,在子表单中,为Activated
和Deactivate
事件设置事件处理程序:
private void Form_Activated(object sender, System.EventArgs e)
{
if (this.Owner != null)
{
this.Owner.Enabled = false;
}
}
private void Form_Deactivate(object sender, System.EventArgs e)
{
if (this.Owner != null)
{
this.Owner.Enabled = true;
}
}
然而,这将导致一种真正奇怪的行为;虽然您将无法立即返回并与父表单进行交互,但激活任何其他应用程序将启用它,然后用户可以与其进行交互。
如果您想让孩子成为modal,请改为使用ShowDialog
:
Form newForm = new ChildForm();
newForm.ShowDialog(this);
答案 4 :(得分:7)
虽然使用前面提到的childForm.ShowDialog(this)将禁用您的主窗体,但它仍然看起来非常禁用。但是,如果在调用ShowDialog()之后在ShowDialog()和Enable = true之前调用Enabled = false,则主窗体看起来甚至会被禁用。
var childForm = new Form();
Enabled = false;
childForm .ShowDialog(this);
Enabled = true;
答案 5 :(得分:6)
ChildForm child = new ChildForm();
child.Owner = this;
child.Show();
//在ChildForm_Load中:
private void ChildForm_Load(object sender, EventArgs e)
{
this.Owner.Enabled = false;
}
private void ChildForm_Closed(object sender, EventArgs e)
{
this.Owner.Enabled = true;
}
答案 6 :(得分:4)
Form1 frmnew = new Form1();
frmnew.ShowDialog();
答案 7 :(得分:4)
@Melodia
很抱歉这不是C#代码,但这是你想要的,除了翻译这应该很容易。
<强> FORM1 强>
Private Sub Form1_MouseEnter(sender As Object, e As EventArgs) Handles MyBase.MouseEnter
Me.Focus()
Me.Enabled = True
Form2.Enabled = False
End Sub
Private Sub Form1_MouseLeave(sender As Object, e As EventArgs) Handles MyBase.MouseLeave
Form2.Enabled = True
Form2.Focus()
End Sub
<强> FORM2 强>
Private Sub Form2_MouseEnter(sender As Object, e As EventArgs) Handles MyBase.MouseEnter
Me.Focus()
Me.Enabled = True
Form1.Enabled = False
End Sub
Private Sub Form2_MouseLeave(sender As Object, e As EventArgs) Handles MyBase.MouseLeave
Form1.Enabled = True
Form1.Focus()
End Sub
希望这有帮助
答案 8 :(得分:3)
您可以使用以下方法执行此操作:
Form3 formshow = new Form3();
formshow.ShowDialog();
答案 9 :(得分:2)
您也可以使用MDIParent-child表单。将子表单的父级设置为MDI Parent
例如
child.MdiParent = parentForm;
child.Show();
在这种情况下,只显示1个表单,子表单将在父表单内。 希望这有帮助
答案 10 :(得分:1)
对我来说,这项工作在这里举例说明当您打开注册表时,主菜单将被禁用。
frmUserRegistration frmMainMenu = new frmUserRegistration();
frmMainMenu.ShowDialog(this);
答案 11 :(得分:0)
如果您只是尝试模拟Form.ShowDialog调用但没有阻止任何内容(有点像模拟对话框表单),您可以尝试使用Form.Show(),并在显示模拟对话框表单后立即禁用所有其他窗户使用类似的东西......
private void DisableAllWindows()
{
foreach (Form f in Application.OpenForms)
if (f.Name != this.Name)f.Enabled = false;
else f.Focus();
}
然后当您关闭&#34;伪对话框表格时#34;一定要打电话....
private void EnableAllWindows()
{
foreach (Form f in Application.OpenForms) f.Enabled = true;
}
答案 12 :(得分:-2)
为什么不让父母等待孩子关闭。这比你需要的更多。
// Execute child process
System.Diagnostics.Process proc =
System.Diagnostics.Process.Start("notepad.exe");
proc.WaitForExit();