9

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

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 线程中制作表格?

4

3 回答 3

5

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

具体到您的问题,一个选项是从 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 表单。

于 2011-01-20T07:05:59.403 回答
2

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

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);
于 2011-08-18T13:10:03.157 回答
-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(); });
}
于 2016-06-16T18:07:29.560 回答