c#如何允许一些较低级别的表单在ShowDialog()方法调用活动表单的情况下访问
本文关键字:表单 方法 调用 活动 访问 情况下 活动表 何允许 较低级 ShowDialog | 更新日期: 2023-09-27 18:26:20
我得到了应用程序,它显示了3种形式:日志窗口、状态窗口项窗口,选择窗口调用一些其他形式,其中一些形式需要使用ShowDialog()调用以返回对话框结果值,以便进一步决策。
使用ShowDialog()会引发问题,导致该方法调用的表单将其他表单排除在可访问范围之外。
因此,我的问题是,无论调用了多少其他表单,我都希望能够至少访问日志窗口。有没有一种方法可以使日志窗口独立于其他窗体,或者它可以被称为last的窗体接管?
编辑: 我没有提到ShowDialog()提供的行为在我的应用程序中非常有用,我只缺乏将一两个表单从锁定中释放出来的能力。切换到Show()不是我认为最好的选项,而其他窗体,即ShowDialog()调用的窗体的父窗体,需要仍然锁定。
您必须在两者之间做出选择。
-
使用
ShowDialog()
,以便父窗体暂停执行,并且只有在第二个窗体或关闭时才恢复执行 -
使用
Show()
,以便您的父窗体在显示第二个窗体后继续执行。
如果你想采取一些行动,或者在第二个表单关闭时从中读取值,那么在显示它之前订阅它的Closed
事件
假设您的第二个表单有一个"名字"TextBox和一个返回该值的属性:
public string FirstName
{
get { return yourFirstNameTextBox.Text; }
}
在你的第一个表单中,你可以订阅一个事件,以便在事件发生时采取一些行动,比如:
var f2 = new SecondForm();
f2.Closed += (s, e) => MessageBox.Show(f2.FirstName);
f2.Show();
现在,用户可以继续使用这两个表单,当第二个表单关闭时,一个消息框将显示"名字"TextBox的值。
你可能会想做一些比这更有意义的事情。您可以更新第一个表单上的字段,或者执行您想要的任何其他操作或一组操作,而不是显示消息框。
f2.Closed += (s, e) =>
{
MessageBox.Show(f2.FirstName);
nameLabel.Text = f2.FirstName;
// another action
// yet another action
};
所以我现在为您的情况建模并找到了解决方案:
- 使用
Show()
代替ShowDialog()
进行对话 - 在对话框中写一些代码,在按下按钮(确定、取消等)后关闭它的窗口。因为自动关闭只适用于
ShowDialog
。但是您不需要手动设置DialogResult
-
在Options表单中,订阅
FormClosed
事件以获得DialogResult
。例如:dlg.FormClosed += (o, a) => { this.Text = dlg.DialogResult.ToString(); };
-
处理选项窗体的
Activate
事件,以防止打开对话框时聚焦在父窗口上:if (dlg != null) dlg.Focus();
该解决方案与ShowDialog
的系统性能有一定差异,但效果良好。