关于winform用show()实现部分showdialog()功能,ManualResetEvent

老潇 2012-08-07 03:59:30
我用的是Mdi窗口,有一个主窗口MainForm,两个子窗口FrmA和frmB,frmA打开frmB,要实现show()后面的代码不执行,不能使用showDialog,因为如果使用showDialog的话,那么MainForm里面其他窗口和控件都不能获得焦点
现在用了线程阻止的方式实现,有一个问题,看下面的方法,当form窗口打开后,里面获得焦点的texbox的光标不会闪,或者说闪得很慢,有无办法解决?,关闭waitOne中的毫秒数也不行,一样不能流畅闪动,还是会卡很久

public static void ShowMyDialg(Form form)
{
using (System.Threading.ManualResetEvent mRest = new System.Threading.ManualResetEvent(false))
{
form.FormClosed += delegate(object sender, FormClosedEventArgs e) { mRest.Set(); };
form.Show();
while (!mRest.WaitOne(30))
{
Application.DoEvents();
}
//这里的代码只有当form关闭后才能执行
mRest.Close();
MessageBox.Show("窗口已关闭!");
}
}
...全文
334 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
老潇 2012-08-07
  • 打赏
  • 举报
回复
就是有一个主窗口MainForm(MDI主窗口),有很多子窗口,打开其中的A、B两个窗口
,A窗口上点击一个按钮弹出C窗口
,C窗口不关闭的话不能操作A,但是可以操作MainForm和其他子窗口,如B窗口,C一直要相对A置顶
,当C窗口关闭后把C窗口中选择的一些数据带到A窗口中
,当然在其他子窗口里面也可以打开C窗口,控制与上面相同

其实我是大概想达到这样的效果,在打开C窗口的方法里面,c.show()后面的代码要在c关闭后再执行


[Quote=引用 3 楼 的回复:]

建议你不要用类似阻止线程运行的方法

用这种
form.FormClosed +=new FormClosedEventArgs (AfterClose);

private void AfterClose(object sender, FormClosedEventArgs e)
{
//form关闭后执行的代码
}
[/Quote]
wxmayifei 2012-08-07
  • 打赏
  • 举报
回复
建议你不要用类似阻止线程运行的方法

用这种
form.FormClosed +=new FormClosedEventArgs (AfterClose);

private void AfterClose(object sender, FormClosedEventArgs e)
{
//form关闭后执行的代码
}
老潇 2012-08-07
  • 打赏
  • 举报
回复
没有这个方法
[Quote=引用 1 楼 的回复:]

mRest.Join()替换while试试
[/Quote]
bdmh 2012-08-07
  • 打赏
  • 举报
回复
mRest.Join()替换while试试

111,093

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧