实现原理,在一个单独的线程里调用子窗口,在这个线程里使用信号量来,控制子窗口,达到对话框的效果。
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)
{
}
});
本文介绍了一种在WPF应用中通过在单独线程中使用信号量来控制子窗口显示,实现类似对话框交互效果的方法。详细阐述了如何在主线程外初始化窗口、使用Dispatcher进行GUI操作、等待窗口关闭并获取结果的过程。
160

被折叠的 条评论
为什么被折叠?



