2011-11-03 117 views
1

最顶级属性设置为true的模式对话框在新线程中显示时不会显示为最顶级。示例代码:在新线程中显示模态对话框(最顶部)

Thread thread = new Thread(KickOffForm); 
thread.SetApartmentState(ApartmentState.STA); 
thread.Start(); 

private void KickOffForm(object state) 
{ 
    Thread.Sleep(5000); // Mimics logic that takes place before form is shown 

    var form = new Form2(); 
    form.ShowDialog(); 
} 

如果窗体在线程的开始处实例化,则模式对话框将显示为最顶部。示例代码:

Thread thread = new Thread(KickOffForm); 
thread.SetApartmentState(ApartmentState.STA); 
thread.Start(); 

private void KickOffForm(object state) 
{ 
    var form = new Form2(); 

    Thread.Sleep(5000); // Mimics logic that takes place before form is shown 

    form.ShowDialog(); 
} 

上述代码在exe启动时实例化的类中执行。

为什么表单会在线程开始时实例化时显示为最顶层,而如果稍后实例化则不显示。

+0

这是你永远不希望显示在另一个线程窗口的确切原因。使用Control.Invoke()将其显示在UI线程上。 –

回答

1

表单只能模式化为它们创建和拥有的线程。

如果要显示停止与主窗体交互的模式对话框,则必须在主UI线程上创建对话框。

这必须是这样,因为每个线程运行它自己的消息循环。一个线程对另一个线程中的任何消息循环一无所知。

1

也许你可以在正确的线程调用对话窗口:

public partial class Form1 : Form 
    { 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     Thread thread = new Thread(KickOffForm); 
     thread.SetApartmentState(ApartmentState.STA); 
     thread.Start(); 

    } 

    private void KickOffForm(object state) 
    { 
     var form = new Form2(); 

     Thread.Sleep(5000); // Mimics logic that takes place before form is shown 

     this.Invoke((Action)(() => { form.ShowDialog(); })); 
    } 
}