ShowDialog()不会阻止原始表单的可点击性
本文关键字:表单 原始 ShowDialog | 更新日期: 2023-09-27 18:00:14
我有一个winform,它包含以下代码,在打开表单时打开一个外部程序。如果程序关闭,则会弹出一个对话框,其中包含一个选项以返回单击了某个按钮。这将关闭对话框并返回到初始形式,然后运行函数再次打开外部程序。
问题是,原始表单仍然可以点击,而且该功能没有运行。有什么想法吗?
public Manager()
{
InitializeComponent();
ExternalProgramOpen();
}
private void ExternalProgramOpen()
{
Process startProgram = Process.Start("program.exe", Program.ConnectionArg);
startProgram.EnableRaisingEvents = true;
startProgram.Exited += this.PrematureClose;
}
private void PrematureClose(object sender, EventArgs e)
{
ManagerWarning messagepopup = new ManagerWarning();
messagepopup.ShowDialog();
using (var ManagerWarning = new ManagerWarning())
{
if (ManagerWarning.ShowDialog() == DialogResult.Retry)
{
ExternalProgramOpen();
}
}
}
产生这种影响的原因可能是Exited
事件不是在启动进程的同一UI线程中引发的。
当您从另一个线程调用ShowDialog()
时,新窗口将不会使用和阻止原始UI线程。
要解决此问题,请检查InvokeRequired
是否为true
,并使用Invoke
:
private void PrematureClose(object sender, EventArgs e)
{
if (InvokeRequired)
{
Invoke(new Action(() => PrematureClose(sender, e)));
return;
}
// your code here
// ...
}