2011-01-20 5 views
9

Sto usando il seguente codice per aprire un modulo in un nuovo thread:Modulo TopMost in una discussione?

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

Ma la forma appena creato non è TopMost anche se ho impostato a true.

Come posso creare un modulo in una discussione TopMost?

risposta

5

In genere non è necessario un altro thread, si apre il modulo come al solito in modalità modale o non modale, se il modulo deve eseguire un processo pesante, quindi si esegue il processo all'interno di un thread.

Specifico per la tua domanda, un'opzione è eseguire il modulo da un'applicazione.Run come descritto 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); 
     } 
    } 
} 

che lancerà un nuovo thread con una propria pompa di messaggio e lo manterrà come una forma superiore.

+0

Ok così che dovrebbe creare un modulo in un nuovo thread e permettere che diventi forma più in alto? Farò un tentativo! thx – syncis

+0

Che in realtà non ha funzionato perché se "Application.Run (_form);" nel nuovo thread è ancora in una nuova discussione e il problema rimarrà che non diventerà più in alto, e se provo ad avviare "Application.Run (_form);" senza iniziare un nuovo thread (a partire dal thread principale), allora ottengo un'eccezione "L'avvio di un secondo loop di messaggi su un singolo thread non è un'operazione valida." – syncis

+0

Ho modificato con un codice più completo, produce il risultato previsto per me –

1

Mi sono imbattuto in questo problema. Sembra che se il modulo ha un Owner, quindi TopMost funziona come previsto. Se il modulo proprietario è stato creato su un altro thread, tuttavia, è un po 'tricky to set. Ecco quello che ho usato:

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

Hai appena salvato il giorno. Grazie mille: 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

Come è la tua risposta è piuttosto disinformativa. Considera l'aggiunta di *** perché *** questa potrebbe essere la soluzione. –

+0

perché funziona! – Daria