2011-01-20 20 views
9

Yeni bir iş parçacığı içinde bir form açmak için aşağıdaki kodu kullanıyorum:Bir iş parçasında TopMost formu?

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

Ancak, yeni oluşturulan form, true olarak ayarladığım halde TopMost değil.

Bir iş parçacığı TopMost içinde nasıl form oluşturabilirim?

cevap

5

Genellikle başka bir iş parçacığına ihtiyacınız yoktur, formun kalıcı bir işlem yapması gerekiyorsa, işlemi bir iş parçacığı içinde yaparsanız, modal veya modal modda her zamanki gibi formu açarsınız.

Sorunuza özel bir seçenek, bir Application.Run formunu here numaralı açıklandığı gibi çalıştırmaktır.

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

Bu, kendi ileti pompası ile yeni bir iş parçacığı başlatır ve bunu bir TopMost formu olarak saklar.

+0

Tamam o yeni dizisindeki bir form oluşturmak ve en tepedeki formu haline gelmesini sağlayabilir böylece? Bir deneyeceğim ! thx – syncis

+0

Bu aslında işe yaramadı çünkü "Application.Run (_form);" yeni iş parçacığında hala yeni bir iş parçacığı var ve sorun en üstte olmayacak ve "Application.Run (_form);" Yeni bir iş parçacığı başlatmadan (ana iş parçacığından başlayarak) sonra istisna alıyorum "Tek bir iş parçacığına ikinci bir ileti döngüsünün başlatılması geçerli bir işlem değildir." – syncis

+0

Daha eksiksiz bir kod ile değiştirdim, bu benim için beklenen sonucu üretir –

1

Sadece bu soruna kendim girdim. Formun bir Owner varsa, TopMost beklendiği gibi çalışır gibi görünüyor. Başka bir iş parçacığında sahip olma formu oluşturulduysa, bu biraz tricky to set. İşte kullanılan budur:

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

Sadece günü kurtardı. Çok teşekkür ederim: 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

Cevabınız oldukça bilgisizdir. *** ekleyerek düşünün *** neden bu çözüm olabilir. –

+0

çünkü işe yarıyor! – Daria

İlgili konular