2011-01-20 14 views
9

estoy usando el siguiente código para abrir un formulario en un nuevo hilo:TopMostrar formulario en un hilo?

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

Pero la forma de nueva creación no TopMost a pesar de que ponemos a true.

¿Cómo puedo hacer un formulario en un hilo TopMost?

Respuesta

5

Normalmente no necesita otro hilo, abre el formulario como de costumbre en modo modal o no modal, si el formulario necesita hacer un proceso pesado, entonces realiza el proceso dentro de un hilo.

Específico para su pregunta, una opción es ejecutar el formulario desde una Aplicación.Ejecutar como se describe here.

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

Eso lanzará un nuevo hilo con su propia bomba de mensajes y lo mantendrá como un formulario TopMost.

+0

Ok por lo que debe crear un formulario en un nuevo hilo y permitir que se convierta formulario de nivel superior? Voy a darle una oportunidad ! thx – syncis

+0

Eso realmente no funcionó porque si "Application.Run (_form);" en el nuevo hilo que todavía está en un nuevo hilo y el problema seguirá siendo que no llegará a ser superior, y si trato de iniciar "Application.Run (_form);" sin iniciar un nuevo hilo (comenzando en el hilo principal) entonces obtengo una excepción "Iniciar un segundo ciclo de mensaje en un único hilo no es una operación válida". – syncis

+0

Modifiqué con un código más completo, produce el resultado esperado para mí –

1

Acabo de toparme con este problema yo mismo. Parece que si el formulario tiene un Owner, entonces TopMost funciona como se esperaba. Si el formulario propietario fue creado en otro hilo, sin embargo, es un pequeño tricky to set. Esto es lo que he usado:

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

Acabas de salvar el día. Muchas gracias: D: D – MarshallOfSound

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

Como su respuesta es bastante poco informativa. Considere agregar *** por qué *** esta podría ser la solución. –

+0

porque funciona! – Daria