2011-01-20 10 views
9

używam następujący kod, aby otworzyć formularz w nowym wątku:TopMost formy w wątku?

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

Ale forma nowoutworzone nie jest najwyższy, chociaż ustawić go na true.

Jak utworzyć formularz w wątku TopMost?

Odpowiedz

5

Zwykle nie potrzebujesz kolejnego wątku, jak zwykle otwierasz formularz w trybie modalnym lub niemodalnym, jeśli formularz musi wykonać ciężki proces, a następnie wykonujesz proces wewnątrz wątku.
Specyficzne dla twojego pytania jedną z opcji jest uruchomienie formularza z Application.Run zgodnie z opisem 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); 
     } 
    } 
} 

Spowoduje to uruchomienie nowego wątku z własną pompą komunikatów i zachowa go jako formularz TopMost.

+0

Ok więc, że należy utworzyć formularz w nowym wątku i pozwolić, aby stało się najwyższą formą? Spróbuję! thx – syncis

+0

To faktycznie nie działa, ponieważ jeśli i "Application.Run (_form);" w nowym wątku nadal jest w nowym wątku, a problem pozostanie, że nie zostanie najwyżej i jeśli spróbuję uruchomić "Application.Run (_form);" bez uruchamiania nowego wątku (zaczynając od głównego wątku), a następnie otrzymuję wyjątek "Uruchomienie drugiej pętli wiadomości na jednym wątku nie jest prawidłową operacją." – syncis

+0

Zmodyfikowałem z bardziej kompletnym kodem, daje mi oczekiwany wynik –

1

Sam wpadłem na ten problem. Wydaje się, że jeśli formularz ma numer Owner, wówczas TopMost działa zgodnie z oczekiwaniami. Jeśli jednak formularz własności został utworzony w innym wątku, jest to trochę tricky to set. Oto, co kiedyś:

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

Właśnie zapisałeś ten dzień. Wielkie dzięki: 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

Jak twoja odpowiedź jest raczej niedoinformowana. Rozważ dodanie *** *** dlaczego to może być rozwiązanie. –

+0

, ponieważ działa! – Daria