ТопСамая форма в теме? - PullRequest
       8

ТопСамая форма в теме?

9 голосов
/ 20 января 2011

Я использую следующий код для открытия формы в новой теме:

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();
}

Но вновь созданная форма не является TopMost, хотя я установил для нее значение true.

Как сделать форму в ветке TopMost?

Ответы [ 3 ]

5 голосов
/ 20 января 2011

Обычно вам не нужен другой поток, вы открываете форму как обычно в модальном или немодальном режиме, если форма требует выполнения тяжелого процесса, вы выполняете процесс внутри потока.

В зависимости от вашего вопроса, один из вариантов - запустить форму из 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.

2 голосов
/ 18 августа 2011

Просто столкнулся с этой проблемой сам.Кажется, что если форма имеет 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);
0 голосов
/ 16 июня 2016

Вместо прямого вызова 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(); });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...