线程中的TopMost表单?

时间:2011-01-20 06:52:25

标签: c# winforms multithreading forms topmost

我使用以下代码在新线程中打开表单:

private void button1_Click(object sender, EventArgs e)
{

    Thread thread = new Thread(ThreadProc);
    thread.Start();
}


public void ThreadProc()
{

    Form form = new Form();
    form.TopMost = true;
    form.ShowDialog();
}

但即使我将其设置为true,新创建的表单也不是TopMost。

如何在线程TopMost中创建表单?

3 个答案:

答案 0 :(得分:5)

通常你不需要另一个线程,你可以像往常一样在模态或非模态模式下打开表单,如果表单需要做一个繁重的过程然后你在一个线程内完成这个过程。

根据您的问题,一个选项是按照here所述的Application.Run运行表单。

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

    private void button1_Click(object sender, EventArgs e)
    {
        Thread thread = new Thread(ThreadProc);
        thread.Start();
    }


    public void ThreadProc()
    {
        using (Form1 _form = new Form1())
        {
            _form.TopMost = true;
            Application.Run(_form);
        }
    }
}

这将启动一个带有自己的消息泵的新线程,并将其保留为TopMost表单。

答案 1 :(得分:2)

我自己遇到了这个问题。似乎如果表单有Owner,则TopMost按预期工作。如果拥有的表单是在另一个线程上创建的,那么它有点tricky to set。这是我使用的:

var form = new Form();

form.Shown += (sender, e) => {
    Control.CheckForIllegalCrossThreadCalls = false;
    form.Owner = /* Owning form here */;
    form.CenterToParent();      // Not necessary
    Control.CheckForIllegalCrossThreadCalls = true;

    form.TopMost = true;        // Works now!
};

Application.Run(form);

答案 2 :(得分:-1)

不要直接调用ShowDialog,而是尝试使用this.Invoke获取表单的所有权。

private void button1_Click(object sender, EventArgs e)
{

    Thread thread = new Thread(ThreadProc);
    thread.Start();
}


public void ThreadProc()
{

    Form form = new Form();
    form.TopMost = true;
    this.Invoke((Action)delegate() { form.ShowDialog(); });
}