使用C#激活子窗体时,如何禁用父窗体?
Answers:
您是否尝试过使用Form.ShowDialog()而不是Form.Show()?
ShowDialog将您的窗口显示为模式窗口,这意味着您无法与父窗体进行交互,直到其关闭。
this.Hide()
父表单代码中的父表单用法。
您是在打电话ShowDialog()
还是Show()
在父母表格的孩子表格上打电话?
ShowDialog
将“阻止”用户与作为参数传递给的表单进行交互ShowDialog
。
在父母中,您可能会这样称呼:
MyChildForm childForm = new MyChildForm();
childForm.ShowDialog(this);
this
父表单在哪里。
Public childForm As New Childformclass
和childForm.ShowDialog(Me)
其中Me是类的父(母型)非常感谢你@Philip
简单易用
Form.ShowDialog();
代替
Form.Show();
在使用时,Form.ShowDialog()
您无法与父窗体进行交互,直到其关闭。
您可以做的是,在显示子表单时确保将父表单作为所有者传递:
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);
虽然使用前面提到的childForm.ShowDialog(this)将禁用您的主窗体,但它看起来确实仍然非常禁用。但是,如果在ShowDialog()之前调用Enabled = false,在ShowShow()之后调用Enable = true,则主窗体甚至看起来已被禁用。
var childForm = new Form();
Enabled = false;
childForm .ShowDialog(this);
Enabled = true;
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;
}
来源:http : //social.msdn.microsoft.com/Forums/vstudio/en-US/ae8ef4ef-3ac9-43d2-b883-20abd34f0e55/how-can-i-open-a-child-window-and-block-仅父窗口
@梅洛迪亚
抱歉,这不是C#代码,但这是您想要的,除了翻译之外,这应该很容易。
表格1
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
表格2
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
希望这可以帮助
如果您只是想模拟Form.ShowDialog调用而没有阻塞任何东西(有点像模拟对话框表单),则可以尝试使用Form.Show(),并在显示模拟对话框表单后立即使用禁用所有其他窗口就像是...
private void DisableAllWindows()
{
foreach (Form f in Application.OpenForms)
if (f.Name != this.Name)f.Enabled = false;
else f.Focus();
}
然后,当您关闭“伪对话框”时,请确保调用...。
private void EnableAllWindows()
{
foreach (Form f in Application.OpenForms) f.Enabled = true;
}
为什么不让父母等孩子关闭呢?这超出了您的需要。
// Execute child process
System.Diagnostics.Process proc =
System.Diagnostics.Process.Start("notepad.exe");
proc.WaitForExit();