实现原理,在一个单独的线程里调用子窗口,在这个线程里使用信号量来,控制子窗口,达到对话框的效果。
public partial class CreateLinkDialog : ChildWindow
{
private ManualResetEvent resetEvent = new ManualResetEvent(false);
public CreateLinkDialog()
{
InitializeComponent();
}
public bool? ShowDialog()
{
//这里必须要用gui线程,否则会导致跨线程调用失败
Dispatcher.BeginInvoke(() =>
{
this.Show();
});
//返回结果前,阻塞调用线程,必须等到子窗口关闭才能获取结果,模拟模式dialog效果
resetEvent.WaitOne();
return this.DialogResult;
}
protected override void OnClosed(EventArgs e)
{
base.OnClosed(e);
//关闭子窗口时通知调用线程可以继续执行
resetEvent.Set();
}
private void OKButton_Click(object sender, RoutedEventArgs e)
{
this.DialogResult = true;
}
private void CancelButton_Click(object sender, RoutedEventArgs e)
{
this.DialogResult = false;
}
}
用法:
CreateLinkDialog dialog = new CreateLinkDialog();
ThreadPool.QueueUserWorkItem(delegate
{
if (dialog.ShowDialog() == true)
{
}
});